C#部分:
1.泛型的出现主要用于解决类、接口、委托、方法的通用性,通过定义泛型类、接口、委托、方法,可以让不同类型的数据使用相同运算规则处理数据,方便了开发。
2.利用System.Nullable<T>泛型可以生成可空的值类型变量,值类型的可空泛型可以简写为关键字加问号,如:int? val=new int?();
3.关于布尔类型的泛型可空& |操作,我们可以知道,如果关心不关心操作数是否为空就能得出结果,那么空值就是无所谓的。
4.可空的泛型值类型的HashValue属性值为true false,当该变量为空时,则HashValue为false。(HashValue和HashCode不是一回事,HashValue是泛型特有的)
5.可空泛型变量拥有特殊双目运算符:??,也叫做空接合运算符,val1??val2等价于 val1=val1==null?:val2;
6.泛型类有最基本的两类:List<T>和Dictionary<K,V>,(尖括号里表示类型的字母可以随便写)。前者表示顺序链表,后者表示键值和值的映射集合。当然我们也可以自己定义自己的泛型类,当然泛型类也会有禁忌:我们不能假定泛型T是哪种类型,所以也就不能进行针对的操作,这一切需要我们在声明泛型对象的时候才能揭晓。例如你不能用T类型重载+运算符。比如:
public class add<X> { public X op1; public Type returnValue() { return this.op1.GetType(); } } class test { public static void Main(String[] args) { add<string> a = new add<string>(); a.op1 = "10"; Console.WriteLine(a.returnValue()); Console.ReadKey(); } }
7.可以对泛型类的T进行约束,比如 public myTClass<T1,T2> where T1:class,interface,struct,基类名(访问性比T还要高的基类),new()(表示约束为有构造函数的公共基类函数,必须写在约束项的最后面)where T2:class,当然了,如果该泛型有继承的话,那么这些约束要写在继承后面:public myTClass<T>:IComparer<T> where T:class。
8.default关键字在泛型中用于确定T类型对象的初始化的值,如果T是值类型,那么初始化为0,如果T为引用类型,那么T对象初始化为null。例子如下:
public class add<X> { public X op1; public X returnValue() { X c=default(X); return c; } } class test { public static void Main(String[] args) { add<int> k = new add<int>(); Console.WriteLine(k.returnValue());//输出0 add<object> ks = new add<object>(); Console.WriteLine(ks.returnValue());//输出null Console.ReadKey(); } }
9.普通类如果继承泛型类,会出现错误,而如果继承的是约定好了类型的泛型类,比如 public class myClass:List<int> 则可以成立
10.泛型接口的应用于泛型类的继承,比如以下的例子:
public class com<T> :IComparer<T> { public int Compare(T x, T y) { int k = x.GetHashCode() - y.GetHashCode(); return k; } } class test { public static void Main(String[] args) { string[] arr = new string[] {"a","b","c" }; List<string> a = new List<string>(); a.AddRange(arr); com<string> k = new com<string>(); Console.WriteLine(k.Compare(a[0], a[1])); myDic.person.sayName(); Console.ReadKey(); } }