泛型

C#更接近于人的思维习惯

大兔子大兔子 提交于 2019-12-10 01:50:10
  我一个同学说过“没有JDK文档的情况下,我没法写Java,但是没有MSDN的情况下,我照样写.Net的程序。”这话我十分赞同。因为Java太混乱了,很多不够合理的地方,没有文档的话,很多你想找的类,你不知道该去哪个包里找。而C#更接近于人的思维习惯。   说一个我跟别人说过很多次的例子。   ---   你要在代码中获取系统当前时间。你会去哪里找?至少我的第一想法是去Date类、Time类或者DateTime类里找。我在Java里找了好久,最后发现在Calendar类里。。。   而且Java下,这个从Calendar类获取的系统时间,要转化成Date、Time之类的东西才能在别处用,可是,印象中要从Date、Time类型的变量中提取int类型的小时、分钟神马的值,很麻烦,反而获取从19xx年1月1号开始的毫秒数很容易。但问题是,我获得这玩意之后可以干嘛?用它比较时间先后倒是不错。   但是在C#下,你直接去DateTime类里,就能找到。DateTime类里有个属性叫Now。而且C#的DateTime类,可以很方便的获取小时、分钟什么的。   ---   而且C#中可以重载运算符,直接用大于号、小于号就可以比较时间先后,用==就可以比较字符串。   而Java里比较字符串非得用.equals(),很纠结呀。   对于那些不习惯用==比较字符串的Java程序员,你在C

[C#] 动态指定泛型类型

[亡魂溺海] 提交于 2019-12-10 00:26:53
前言 今天为了程序能写好看一点,一直在纠结怎么指定动态泛型, 但是想想实用性好像不太大,可是把这技术忘掉太可惜XD 还是记录下来,以防忘记 以下程序范例 类 cs 12345678910111213141516171819202122232425262728 public class DynamicGeneric<T> where T : class , new(){ public string Name { get; set; } public void () { Console.WriteLine("Hello"); } public T () { return new T(); } }public class MyClass1{ public string MyProperty { get; set; } public void MyMethod() { Console.WriteLine("I'm Class1 Method"); }} 执行过程 执行过程 cs 1234567891011121314151617181920 大专栏 [C#] 动态指定泛型类型2122232425262728293031323334353637383940 static void Main(string[] args){ // 效果大概像这样 // var type = typeof

c#之泛型详解(Generic)

吃可爱长大的小学妹 提交于 2019-12-09 23:57:49
这篇文章主要来讲讲c#中的泛型,因为泛型在c#中有很重要的位置,对于写出高可读性,高性能的代码有着关键的作用。 一、什么是泛型? 泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个非常重要的新功能。 我们在编程程序时,经常会遇到功能非常相似的模块,只是它们处理的数据不一样。但我们没有办法,只能分别写多个方法来处理不同的数据类型。这个时候,那么问题来了,有没有一种办法,用同一个方法来处理传入不同种类型参数的办法呢?泛型的出现就是专门来解决这个问题的,可以看出,微软还是很贴心的。 二、为什么要使用泛型? 接下来我们来看一段代码。 public class GenericClass { public void ShowInt(int n) { Console.WriteLine("ShowInt print {0},ShowInt Parament Type Is {1}",n,n.GetType()); } public void ShowDateTime(DateTime dt) { Console.WriteLine("ShowDateTime print {0},ShowDateTime Parament Type Is {1}", dt, dt.GetType()); } public void ShowPeople(People people) {

c#学习笔记——泛型(Generic)

◇◆丶佛笑我妖孽 提交于 2019-12-09 22:14:32
一、泛型是什么? 1、通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型"将类型抽象化,从而实现灵活的复用。 换句话来说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。 2、在 C# 语言中泛型方法是指通过泛型来约束方法中的参数类型,也可以理解为对数据类型设置了参数。 如果没有泛型,每次方法中的参数类型都是固定的,不能随意更改。 在使用泛型后,方法中的数据类型则有指定的泛型来约束,即可以根据提供的泛型来传递不同类型的参数。 定义泛型方法需要在方法名和参数列表之间加上 <> ,并在其中使用 T 来代表参数类型。 当然,也可以使用其他的标识符来代替参数类型, 但通常都使用 T 来表示。 二、实例 【实例】创建泛型方法,实现对两个数的求和运算。 根据题目要求,代码如下。 class Program { static void Main (string [] args ) { //将T设置为double类型 Add < double >( 3.3 , 4 ); //将T设置为int类型 Add < int >( 3 , 4 ); } //加法运算 private static void Add <T >( T a , T b ) { double sum = double . Parse (a . ToString ()) + double . Parse (b

【java】List集合,map等为null,导致空指针异常。

眉间皱痕 提交于 2019-12-09 18:29:59
举例说明: List<apple> apples=null; System.out.println(apples.size());//会报空指针 解决方案: List<apple> apples=Collections.emptyList() System.out.println(apples.size());//不会报错了 ps: 有泛型,用Collections.emptyList(); 没有泛型,用Collections.EMPTY_LIST; map等同理 Collections.EMPTY_SET Collections.EMPTY_MAP 注意! Collections.emptyList()是final修饰, add,put等操作会报错。 来源: CSDN 作者: mudarn 链接: https://blog.csdn.net/mudarn/article/details/103461640

泛型 - Type

心不动则不痛 提交于 2019-12-09 15:58:00
Java泛型采用类型擦除实现,类型编译时被擦除为Object,不兼容基本类型。类型擦除的实现方案主要考虑后向兼容,泛型类型签名信息特定场景下反射可获取 泛型类型擦除的好处: 1.运行时内存负担小,List和List<String>是一种类型(编译后List和List<String>都是List) 2.兼容性好,Java1.5才推出泛型,它兼容之前的版本 泛型类型擦除的坏处: 1.基本类型无法作为泛型实参 2.泛型类型无法用作方法重载,编译后List<Integer>和List<String>都是List 3.泛型类型无法当作真实类型使用 static <T> void genericMethod(T t){ T newInstance = new T(); // (no) T[] array = new T[0];// (no) Class c = T.class; //(no) List<T> list = new ArrayList<T>();//(ok) if(list instanceof List<String>){} //(no) } 使用注意 1.静态方法无法引用类型泛型参数 静态方法无法引用类型泛型参数(类泛型是类实例化的时候才知道,所以静态方法无法引用类泛型) 1.错误实例 class GenericClass<T> { public static T max(T

阅读JDK源码的一些基础知识

我的未来我决定 提交于 2019-12-09 15:18:48
目录 1 关键字 native:该方法由其他语言实现如C/C++,在Java中只是调用。 2 泛型 泛型的常用的几种表示: E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ? - 表示不确定的java类型 T bean ; Class<T> bean; Class<?> bean; 单独的T代表一个类型,而Class<T>和Class<?>代表这个类型所对应的类 Class<T>在实例化的时候,T要替换成具体类 Class<?>它是个通配泛型,?可以代表任何类型 <? extends T>受限统配,表示T的一个未知子类。 <? super T>下限统配,表示T的一个未知父类。 0 来源: https://www.cnblogs.com/youngao/p/12011105.html

泛型

梦想的初衷 提交于 2019-12-09 14:28:09
泛型方法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Generic { class Program { static void Main(string[] args) { var Result = GetT<int, int>(30, 40); Console.WriteLine(Result); Console.ReadLine(); } static T GetT<T, T1>(T a, T1 b) { //dynamic表示在运行时解析对象 //这里不可以直接返回a+b,必须使用dynamic dynamic a1 = a; dynamic b1 = b; return a1 + b1; } } } View Code default using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Generic { class Program { static void Main

[转载]讲一讲list泛型的区别

烂漫一生 提交于 2019-12-09 14:02:32
定义:声明中具有一个或者多个类型参数(type parameter)的类或者接口,就是泛型类或者接口。泛型类和接口统称为泛型(generic type)。 clipboard.png 每种泛型定义一组类型形参(formal type parameters),这些类型形参有时也被简称为类型参数(type parameter),例如对于泛型(generic type)List而言,List就是一个参数化的类型(parameterized type),String就是对应于类型形参(formal type parameters)的类型实参(actual type parameter)。 每个泛型定义一个原生类型(raw type),即不带任何类型参数的类型名称,例如,与List对应的原生类型是List。原生类型就像从类型声明中删除了所有泛型信息一样。实际上原生类型List与Java平台在有泛型之前的接口类型List完全一样。 容器类使用泛型的好处: 安全性:在对参数化类型的容器中放入了错误即不匹配的类型的时候,编译器将会强制性进行错误提示。 便利性:当从容器中取出元素的时候不用自己手动将Object转换为元素的实际类型了,编译器将隐式地进行自动转换。 表述性:带有类型实参的泛型即参数化类型,可以让人看到实参就知道里面的元素E都是什么类型。 所以,不应该使用原生类型的原因如下:

C#集合类型总结和性能分析

假如想象 提交于 2019-12-09 05:41:14
C#集合类型概述 集合是.NET FCL(Framework Class Library)中很重要的一部分。所有的集合类都继承自 IEnumerable 。集合类总体可分为一下几类:关联/非关联型集合,顺序/随机访问集合,顺序/无序集合,泛型/非泛型集合,线程安全集合。 各集合类底层接口关系图 泛型与非泛型集合类的分析 泛型集合是类型安全的 ,基于固定的泛型T,运行时不需要像非泛型的执行Object和具体类型的类型转换。 泛型集合的效率相对较高。 两者都能实现数据存储,不同的是泛型只能存放T类型数据,有运行时检测,而非泛型的都转化为Object存储,能存储任意类型,包括值类型,会带来装箱拆箱的性能损耗,同时都是Object类型(弱类型)编译时无法类型检测,运行时会导致类型不一致的安全性问题。 具体接口/类分析 CollectionBase/DictionaryBase的目的 都是抽象类,不能实例化; 目的是提供给用户自定义实现强类型的集合,解决一般非泛型集合的弱类型不安全的问题。 IEnumerator/IEnumerable IEnumerator定义了我们遍历集合的基本方法,以便我们可以实现单向向前的访问集合中的每一个元素。 所有的集合类都继承了IEnumerator接口,包括String类。 而IEnumerable只有一个方法GetEnumerator即得到遍历器。