温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#泛型类概念举例分析

发布时间:2021-12-02 11:20:56 来源:亿速云 阅读:137 作者:iii 栏目:编程语言

这篇文章主要讲解了“C#泛型类概念举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#泛型类概念举例分析”吧!

C# 泛型类封装不是特定于具体数据类型的操作。泛型类最常用于集合,如链接列表、哈希表、堆栈、队列、树等,其中,像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关。对于大多数需要集合类的方案,推荐的方法是使用 .NET Framework 2.0 类库中所提供的类。一般情况下,创建泛型类的过程为:从一个现有的具体类开始,逐一将每个类型更改为类型参数,直至达到通用化和可用性的***平衡。创建您自己的泛型类时,需要特别注意以下事项:

将哪些类型通用化为类型参数。一般规则是,能够参数化的类型越多,代码就会变得越灵活,重用性就越好。但是,太多的通用化会使其他开发人员难以阅读或理解代码。如果存在约束,应对类型参数应用什么约束。一个有用的规则是,应用尽可能最多的约束,但仍使您能够处理需要处理的类型。例如,如果您知道您的泛型类仅用于引用类型,则应用类约束。这可以防止您的类被意外地用于值类型,并允许您对 T 使用 as 运算符以及检查空值。 是否将泛型行为分解为基类和子类。由于泛型类可以作为基类使用,此处适用的设计注意事项与非泛型类相同。

例如,如果您设计一个类,该类将用于创建基于泛型的集合中的项,则可能需要实现一个接口,如 IComparable<T>,其中 T 是您的类的类型。

类型参数和约束的规则对于泛型类行为有几方面的含义,特别是关于继承和成员可访问性。请务必先理解一些术语,然后再继续进行。对于泛型类 Node<T>,,客户端代码可以通过指定类型参数引用该类,以创建封闭式构造类型 (Node<int>),或者可以让类型参数处于未指定状态(例如在指定泛型基类时)以创建开放式构造类型 (Node<T>)。泛型类可以从具体的、封闭式构造或开放式构造基类继承:

C# 泛型类代码

class BaseNode { }  class BaseNodeGeneric<T> { }   // concrete type  class NodeConcrete<T> : BaseNode { }   //closed constructed type  class NodeClosed<T> : BaseNodeGeneric<int> { }   //open constructed type   class NodeOpen<T> : BaseNodeGeneric<T> { }

非泛型(具体)类可以从封闭式构造基类继承,但无法从开放式构造类或裸类型参数继承,因为在运行时客户端代码无法提供实例化基类所需的类型变量。

C# 泛型类代码

//No error  class Node1 : BaseNodeGeneric<int> { }   //Generates an error  //class Node2 : BaseNodeGeneric<T> {}   //Generates an error  //class Node3 : T {}

从开放式构造类型继承的泛型类必须为任何未被继承类共享的基类类型参数提供类型变量,如以下代码所示:

C# 泛型类代码

class BaseNodeMultiple<T, U> { }   //No error  class Node4<T> : BaseNodeMultiple<T, int> { }   //No error  class Node5<T, U> : BaseNodeMultiple<T, U> { }   //Generates an error  //class Node6<T> : BaseNodeMultiple<T, U> {}

从开放式构造类型继承的泛型类必须指定约束,这些约束是基类型约束的超集或暗示基类型约束:

C# 泛型类代码

class NodeItem<T> where T : System.IComparable<T>, new() { }  class SpecialNodeItem<T> :   NodeItem<T> where T : System.IComparable<T>, new() { }

泛型类型可以使用多个类型参数和约束,如下所示:

C# 泛型类代码

class SuperKeyType<K, V, U>      where U : System.IComparable<U>      where V : new()  { }

开放式构造类型和封闭式构造类型可以用作方法参数:

C# 泛型类代码

void Swap<T>(List<T> list1, List<T> list2)  {      //code to swap items  }   void Swap(List<int> list1, List<int> list2)  {      //code to swap items  }

泛型类是不变的。也就是说,如果输入参数指定 List<BaseClass>,则当您试图提供 List<DerivedClass> 时,将会发生编译时错误。

感谢各位的阅读,以上就是“C#泛型类概念举例分析”的内容了,经过本文的学习后,相信大家对C#泛型类概念举例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI