c#泛型

来源:互联网 发布:天下3捏脸大赛数据 编辑:程序博客网 时间:2024/05/16 20:30

参考博文:http://www.cnblogs.com/1175429393wljblog/p/5519701.html

泛型类型参数:其是一个占位符,不是一个真正的类型,而更像是一个类型的蓝图。当我们在声明,实例化该类型的变量时,则把T改为指定的类型。

eg:class Mylist<T>{....}  

Mylist<float> list1 = new Mylist<float>();

类型参数的约束:一个约束是一种基类约束,他通知编译器,只有这个类型的对象或从这个类型派生出来的对象,可被用作类型参数。一旦编译器得到这种保证,它就允许泛型类中调用这个类型的方法。上下文用where用以实现约束。

eg:public class Employee{...}

class MyList<T>where T:Employee{...}

约束使得泛型类能够使用Employee.Name的属性,因为所有为T类型的元素,都是一个Employee对象或是一个继承自Employee的对象。

class MyList<T> where T: Employee, IEmployee,  IComparable<T>,  new()
{…}
下面列举6种类型的约束:
T: 结构---类型参数必须是值类型。可以指定除Nullable以外的任何值类型。
T: 类---类型必须是引用类型。这一点也适用于任何类,接口,委托或数组的类型。
T: new()----类型参数必须是具有无参数的公共构造函数。当与其他约束一起使用时,new()约束必须最后指定。
T: <接口名称>---类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束也可以是泛型的。
T:U----为T提供的类型参数必须是为U提供的参数或派生自为U提供的参数。这被称为裸类型约束。
如果对泛型成员执行任何赋值以外的操作,或者是调用System.Object中所没有的方法,就需要在类型参数上使用约束。
无类型约束
当约束是个泛型类型参数时,他就叫无类型约束,当一个有类型参数成员方法,要把它的参数约束为其所在类的类型参数时,无类型约束就很有用。
eg: class List<T>
{
void Add<U>(List<U> items)where U:T{}
}
当无类型约束在泛型类中定义时,其一定要和其他类型参数一起在<>中申明因为编译器值认为无类型约束是从System.Object继承而来,所以带有无类型约束的泛型类很有限。
当你希望两个类型参数有继承关系,可对泛型类型使用无类型约束
public class MyClass<T,U,V> where T : V
泛型类
  非泛型的具体类可以继承自封闭构造基类,但不能继承自开放构造基类。这是因为客户代码无法提供基类所需的类型参数
2.泛型的具体类可以继承自开放构造类型。除了与子类共用的类型参数外,必须为其他所有的类型参数指定类型,如下代码所示:
//Generates an error.
class Node<T> : BaseNode<T, U> {…}
//Okay.
class Node<T> : BaseNode<T, int>{…}
3.泛型类型可以使用多种类型参数和约束
4.开放结构和封闭构造类型型可以用作方法的参数
5..泛型类可以继承自具体类、封闭构造类型或开放构造类型
泛型接口
  当一个接口被指定为类型参数的约束时,只有实现该接口的类型可被用作类型参数
可以在一个类型指定多个接口作为约束
一个接口可以定义多个类型参数
泛型类可以实现泛型接口或封闭构造接口,只要类的参数列表提供了接口需要的所有参数
泛型类可以实现泛型接口或封闭构造接口,只要类的参数列表提供了接口需要的所有参数
eg: class Myclass<T>:IBaseinterface<T>
class Myclass<T>:IBaseinterface<T,string>
泛型方法
静态方法和实例方法有着同样的类型推断规则。编译器能够根据传入的方法参数来推断类型参数
泛型委托
C#2.0版有个新特性称为方法组转换(method group conversion),具体代理和泛型代理类型都可以使用
eg:MyDelegate<int> m = new MyDelegate<int>(Notify);
MyDelegate<int> m = Notify;
引用委托的代码必须要指定所在类的类型参数
eg:Stack<float> s = new Stack<float>();
Stack<float>.StackDelegate myDelegate = StackNotify;


0 0
原创粉丝点击