泛型:实质:一次编码,多次使用。类型化参数。(参数的类型 当做不定值)
好处:
1、使用泛型可以最大限度地重用代码、保护类型的安全以及提高性能。
2、泛型最常见的用途是创建集合类,在集合类中,泛型被应用的淋漓尽致。
3、可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
4、可以对泛型类进行约束以限制使用这个类的具体版本。
5、泛型中使用的参数类型可以在运行时通过反射获取相关信息。
.NET Framework类库在System.Collections.Generic命名空间中包含几个新的泛型集合类。应尽可能地使用这些类来代替普通的类,如System.Collections命名空间中的ArrayList,这个问题我们将在介绍集合类的时候会向大家详细的介绍。
类:public class person<T>
{
public void shou(T temp) { int a = "手";}
public void yan() { int b = "眼"; }
}
调用:
person<int> p = new person<int>();
p.shou(1);
person<string> s = new person<string>();
s.shou("a");
可以看出,泛型类与Object实现的类有很大的区别:
1.、泛型类比object实现的类更安全。实例化了int类型的堆栈,就不能处理string类型的数据,而且处理了别的类型的数据,在编译的时候就通不过,很安全。
2、Object实现的类需要进行装箱和拆箱。泛型类可以在实例化时,按照传入的数据类型生成本地代码,这时,本地代码数据类型已确定,这样就无需装箱和拆箱。
3、泛型不需要进行数据类型转换,节省了CPU的计算时间。
二泛型约束
6种约束
例子:public class C<T> where T : Stack, IComparable{..... }
T:struct,类型参数必须是值类型。可以指定除Nullable以外的任何值类型。
public class MyClass<T> where T : struct{...}
T:class,类型参数必须是引用类型,包括任何类、接口、委托或数组类型。
public class MyClass<T> where T : class{...}
T:new() 类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new()约束必须最后指定。
public MyClass class<T> where T : new(){...}
T:<基类名>,类型参数必须是指定的基类或派生自指定的基类。
public class MyClass<T> where T : Stack{...}
T:<接口名称> ,类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
public class MyClass<T> where T : IComparable{...}
T:U,为T提供的类型参数必须是为U提供的参数或派生自为U提供的参数。这称为裸类型约束。
public class MyClass<T> where T : U{...}
三 泛型方法
例子: public void person<T>(T t)
{
string a = "ddd";
}
调用:
Customer c = new Customer();
c.person<int>(1);
注意:重要原则:当一般方法与泛型方法具有相同的签名时,会覆盖泛型方法。
public T add(T a, V b)
{
return b; //返回V类型的数据
}
调用:Node<int, int> node = new Node<int, int>();
int x = node.add(1, 10);//返回数据由调用类型决定。