打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C# 泛型 约束

C# 泛型 约束

泛型以前就接触过,只不过以前没有系统的学习一下,弄的稀里糊涂的,上次我们看见一段代码,都是泛型的,一个 泛型后面Where T:new () ,一个泛型后面Where  T:class,别人一问,还真不知道是怎么回事,翻开书籍,发现了一个很像的Where  T:IComparable<T>,弄的一头雾水,都T了,真没还new 啊,class 啊之类的,到底这是干什么的呢?

 

我们接下来就学习一下:

查阅csdn关于泛型的,从定义到优点到应用都详细的列出来了,我也就连边Copy学边做记录。

泛型的基础知识就不多说了,就粘些现成的:

 

泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。泛型通常用在集合和在集合上运行的方法中。.NET Framework 2.0 版类库提供一个新的命名空间 System.Collections.Generic,其中包含几个新的基于泛型的集合类。建议面向 2.0 版的所有应用程序都使用新的泛型集合类,而不要使用旧的非泛型集合类,如 ArrayList

当然,也可以创建自定义泛型类型和方法,以提供自己的通用解决方案,设计类型安全的高效模式。下面的代码示例演示一个用于演示用途的简单泛型链接列表类。(大多数情况下,建议使用 .NET Framework 类库提供的 List<T> 类,而不要自行创建类。)在通常使用具体类型来指示列表中所存储项的类型时,可使用类型参数 T

代码就不粘了,浪费地方,优点什么的也不粘了,下面是csdn上的关于泛型的介绍。

http://msdn.microsoft.com/zh-cn/library/512aeb7t(VS.80).aspx

 

现在开始学习where T:后面的一堆东西,当时可是让这个弄的迷糊了。

Csdn上说约束是使用 where 上下文关键字指定的,那么就可以知道T 后面的约束是用来约束T,也就是说T:后面指定的就是该类型的。

迷糊:如果where约束了到了一个确定的类型,那么这个泛型还有什么作用呢?

原来后面的约束类型还是一个范围的,只不过是该范围定的更小了,例如T:类,则这样的范伟指定的就是类型参数必须是引用类型,包括任何类、接口、委托或数组类型,如果除了这几样就是非法的了,可见优点还是大大的,可以输入任何的引用类型同时也确定了范伟,防止输入结果之类的值类型导致错误。可见好处多多。

下面是csdn中列出的约束类型介绍。

 

约束

说明

T:结构

类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。有关更多信息,请参见使用可空类型(C# 编程指南)

T:类

类型参数必须是引用类型,包括任何类、接口、委托或数组类型。

Tnew()

类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。

T<基类名>

类型参数必须是指定的基类或派生自指定的基类。

T<接口名称>

类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。

TU

T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。

 

只里面值得注意的地方就是那个Tnew(),因为在说明中已经清楚的说明,如果还有其他的约束在一起的话,必须放在最后,这个一定要注意一下。

在注意的地方就是:在应用 where T : class 约束时,建议不要对类型参数使用 == != 运算符,因为这些运算符仅测试引用同一性而不测试值相等性。即使在用作参数的类型中重载这些运算符也是如此。

 

可以对同一类型参数应用多个约束,并且约束自身可以是泛型类型,这里面就不得不重提上面的注意了,如果有new(),则一定要放在最后。

 

通过约束类型参数,可以增加约束类型及其继承层次结构中的所有类型所支持的允许操作和方法调用的数量。

因此,在设计泛型类或方法时,如果要对泛型成员执行除简单赋值之外的任何操作或调用 System.Object 不支持的任何方法,您将需要对该类型参数应用约束。

 

未绑定的类型参数


没有约束的类型参数(如公共类 SampleClass<T>{} 中的 T)称为未绑定的类型参数。未绑定的类型参数具有以下规则:

·   不能使用 != == 运算符,因为无法保证具体类型参数能支持这些运算符。

·   可以在它们与 System.Object 之间来回转换,或将它们显式转换为任何接口类型。

·   可以将它们与 null 进行比较。将未绑定的参数与 null 进行比较时,如果类型参数为值类型,则该比较将始终返回 false

· 裸类型约束

·             用作约束的泛型类型参数称为裸类型约束。当具有自己的类型参数的成员函数需要将该参数约束为包含类型的类型参数时,裸类型约束很有用,

泛型类的裸类型约束的作用非常有限,因为编译器除了假设某个裸类型约束派生自 System.Object 以外,不会做其他任何假设。在希望强制两个类型参数之间的继承关系的情况下,可对泛型类使用裸类型约束。

 

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
泛型
java泛型(一)、泛型的基本介绍和使用
技术图文:C#语言中的泛型 I
CLR 中的范型详解(转与MSDN)
Java核心技术 PDF 高清电子书
125个基本的C#面试问答
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服