C#泛型理解(一)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#泛型理解(⼀)
⼀、什么是泛型
泛型是C#语⾔和公共语⾔运⾏库(CLR)中的⼀个新功能,它将类型参数的概念引⼊.NET Framework。类型参数使得设计某些类和⽅法成为可能,例如,通过使⽤泛型类型参数T,可以⼤⼤简化类型之间的强制转换或装箱操作的过程。说⽩了,泛型就是通过参数化类型来实现在同⼀份代码上操作多种数据类型,利⽤“参数化类型”将类型抽象化,从⽽实现灵活的复⽤。
以下是⼀个简单的⽰例,可以通过T来控制不同的类型
此时,Test就是⼀个泛型类。T就是要实例化的泛型类型。如果T被实例化为int型,那么成员变量就是int型的,如果T被实例化为string型,那么就是string类型的。
该例中,我创建了⼀个称为MyList泛型类。为把它参数化,我简单地插⼊了⼀个尖括号。在<>内的T代表了实际的当使⽤该类时要指定的类型。在MyList类中,定义了⼀个静态字段objCount。我在构造器中增加它的值。因此我能发现使⽤我的类的⽤户共创建了多少个那种类型的对象。属性Count返回与被调⽤的实例同类型的实例的数⽬。
泛型⽅法
Copy()⽅法就是⼀个泛型⽅法,它与参数化的类型T⼀起⼯作。当在Main()中激活Copy()时,编译器根据提供给Copy()⽅法的参数确定出要使⽤的具体类型。
⼆、泛型的主约束和次约束是什么?
where T : struct 类型必须是⼀种值类型(struct)
where T : class 类型必须是⼀种引⽤类型(class)
where T : new() 类型必须有⼀个⽆参数的构造器
where T : class_name 类型可以是class_name或者是它的⼀个⼦类
where T : interface_name 类型必须实现指定的接⼝
你可以指定约束的组合,就象: where T : IComparable, new()。这就是说,⽤于参数化类型的类型必须实现Icomparable接⼝并且必须有⼀个⽆参构造器。
举例
1.接⼝约束。
例如,可以声明⼀个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 IComparable<T> 接⼝:
区别于
⼀个是T继承IComparable,⼀个是MyGenericClass2继承IComparable
2.基类约束。
指出某个类型必须将指定的类作为基类(或者就是该类本⾝),才能⽤作该泛型类型的类型参数。这样的约束⼀经使⽤,就必须出现在该类型参数的所有其他约束之前。
3.构造函数约束。
以使⽤ new 运算符创建类型参数的实例;但类型参数为此必须受构造函数约束 new() 的约束。new() 约束可以让编译器知道:提供的任何类型参数都必须具有可访问的⽆参数(或默认)构造函数。new() 约束出现在 where ⼦句的最后。
4.对于多个类型参数,每个类型参数都使⽤⼀个 where ⼦句。
5.还可以将约束附加到泛型⽅法的类型参数。
6. 裸类型约束
⽤作约束的泛型类型参数称为裸类型约束。当具有⾃⼰的类型参数的成员函数需要将该参数约束为包含类型的类型参数时,裸类型约束很有⽤。(不太明⽩)
为什么要有约束呢?
当⼀个泛型参数没有任何约束时,它可以进⾏的操作和运算时⾮常有限的。因为不能对实参做任何类型上的保证,这时候就需要⽤到泛型的约束。泛型的主要约束和次要约束都是指泛型的实参必须满⾜⼀定的规范。C#编译器在编译的过程中可以根据约束来检查所有泛型类型的实参并确保其满⾜约束条件。
⼀个泛型参数可以⾄多拥有⼀个主要约束,主要约束可以是⼀个引⽤类型、class或者struct。如果指定⼀个引⽤类型,则实参必须是该类型或者该类型派⽣类型。class规定实参必须是⼀个引⽤类型。struct规定了参数必须是⼀个之类新。