本文主要讲解“C#泛型类概念的实例分析”,简单明了,易学易懂。请跟随边肖的思路,一起学习《C#泛型类概念例析》!
C#泛型类封装了不特定于特定数据类型的操作。泛型类最常用于集合,如链表、哈希表、堆栈、队列、树等。其中以基本相同的方式执行诸如从集合中添加和移除项的操作,而不管存储数据的类型如何。对于大多数需要类集合的情况,推荐的方法是使用。NET框架2.0类库。一般来说,创建泛型类的过程是:从一个现有的具体类开始,将每个类型逐个更改为一个类型参数,直到达到泛化和可用性之间的平衡。创建自己的泛型类时,需要特别注意以下几点:
将哪些类型归纳为类型参数。一般规则是,可以参数化的类型越多,代码将变得越灵活和可重用。但是,过于一般化会使其他开发人员难以阅读或理解代码。如果有约束,应该对类型参数应用哪些约束。一个有用的规则是应用尽可能多的约束,但仍然允许您处理需要处理的类型。例如,如果您知道泛型类仅用于引用类型,请应用类约束。这可以防止您的类被意外地用于值类型,并允许您在t上使用as运算符并检查空值。是否将泛型行为分解为基类和子类。由于泛型类可以用作基类,因此这里的设计考虑与非泛型类相同。
例如,如果您设计了一个将用于在基于泛型的集合中创建项的类,您可能需要实现一个接口,例如IComparableT,其中t是您的类的类型。
参数和约束的规则对于泛型类行为有几种含义,尤其是关于成员的继承和可访问性。在继续之前,一定要理解一些术语。对于泛型类NodeT,客户端代码可以通过指定类型参数来引用该类,以创建封闭构造类型(Nodeint),或者可以将类型参数保留在未指定的状态(例如,在指定泛型基类时)以创建开放构造类型(NodeT)。泛型类可以从具体的、封闭的或开放构造的基类继承:
C#泛型类代码
class basenode { } class basenodegnerict { }//混凝土类型类节点混凝土: base node { }//closedconstructedtypedclass nodeclosedtd : base nodegenericnt { }//openconstructedtypedclass nodeopent : basenodegenetit { }非泛型(混凝土)类可以从封闭构造的基类继承,但不能从开放构造的类或裸类型参数继承,因为客户端代码无法提供在运行时实例化基类所需的类型变量。
C#泛型类代码
//no errorrclasnode 1: base node genericity { }//Generatesanerror//class node genericit { }//Generatesanerror//class node :t { }从开放构造类型继承的泛型类必须为继承类不共享的任何基类类型参数提供类型变量,如以下代码所示:
C#泛型类代码
classBaseNodeMultipleT,U{}//noerrorclassnode4t : basenode multiplet,int{}//NoerrorclassNode5T,U:BaseNodeMultipleT,U { }//generate senror//class node6t : basenode impression,U { }从开放式构造类型继承的泛型类必须指定约束,这些约束是基类型约束或隐含基类型约束的超集:
C#泛型类代码
Classnodeitemtwhert:system。icomparablet,new(){ } class specialnode item : nodeitemtwhert 3360 system。icomparablet,new () {}泛型类型可以使用多个类型参数和约束,如下所示:
C#泛型类代码
Classsuperceytypek,v,uwhereu3360system。icomparableuwherev 3360 new(){ }开放式和封闭式构造类型可用作方法参数:
C#泛型类代码
Voidswapt (listtlist1,listtlist 2){//codetoswapitems } void swapt(listinlist 1,listinlist 2){//codetoswapitems }泛型类是不可变的。也就是说,如果输入参数指定了ListBaseClass,那么当您试图提供ListDerivedClass时,将会出现编译时错误。
感谢阅读。这就是“C#泛型类概念的实例分析”的内容。学习完这篇文章,相信你对C#泛型类概念的实例分析问题有了更深的理解,具体用法还需要实践验证。在这里,边肖将为您推送更多关于知识点的文章,敬请关注!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/130827.html