一、概念
什么是泛型?个人观点是把两个字分开理解,‘泛’意思是很多,泛指,‘型’就是参数类型,合起来就是多种参数类型,或者说类型参数。
二、作用
ArrayList是一个很方便的容器类,使用中无需更改就可以存储任何引用类型或值类型,但是这种便利是有代价的,这需要把任何一个加入ArrayList的引用类型或值类型都隐式地向上转换成System.Object,中间出现了许多装箱拆箱操作,降低了系统性能。ArrayList和其他相似的类真正需要的是一种途径,能让客户代码在实例化之前指定所需的特定数据类型,直观的来说需要的是类型参数,也就是泛型。泛型最常用的应用场景就是数据集合。
三、定义
泛型在定义时一般用T(A、B、C等大写字母都可以)表示类型参数,客户需要在调用之前确定参数类型(int、bool、string等)。
1、List<T> list1 = new List<>();
2、List<int> list1 = new List<int>();
泛型方法:
public void test<T>(T param){ }
泛型类:
class TClass<T> { public void test(T param) { } }
泛型接口:
interface ITClass<T> { void test(T param); }
上面的泛型类可以继承泛型接口:
class TClass<T> : ITClass<T> { public void test(T param) { throw new NotImplementedException(); } }
四、泛型约束
若要检查表中的一个元素,以确定它是否合法或是否可以与其他元素相比较,那么编译器必须保证:客户代码中可能出现的所有类型参数,都要支持所需调用的操作或方法。这种保证是通过在泛型类的定义中,应用一个或多个约束而得到的。
class MyList<T> where T: Employee {...} //可以使用多个约束,约束自身也可以是泛型类 class MyList<T> where T: Employee, IEmployee, IComparable<T>, new() {…}
下图是五种约束类型:
约束 |
描述 |
where T: struct |
类型参数必须为值类型。 |
where T : class |
类型参数必须为引用类型。 |
where T : new() |
类型参数必须有一个公有、无参的构造函数。当于其它约束联合使用时,new()约束必须放在最后。 |
where T : <base class name> |
类型参数必须是指定的基类型或是派生自指定的基类型。 |
where T : <interface name> |
类型参数必须是指定的接口或是指定接口的实现。可以指定多个接口约束。接口约束也可以是泛型的。 |
标签:C#,约束,类型,参数,泛型,new,where 来源: https://www.cnblogs.com/Darius0821/p/16468805.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。