什么是泛型
泛型就是将类型做参数的技术!
详细一点来说就是:
泛型就是就是使用类型参数定义的数据类型或方法。
平常使用List的时候,我们就在不知不觉中已经使用了泛型。
泛型的语法
泛型的语法有俩种.
第一种是在类名后面加上
class My<T>
{
ArrayList arrList = new ArrayList();//
public void Add(T i)
{
arrList.Add(i);
}
}```
第二种是在方法名后面加上<T>
```csharp
class Your
{
ArrayList arrList = new ArrayList();//
public void Add<T>(T i)
{
arrList.Add(i);
}
}
俩种格式都可以,看个人爱好调用。
为什么要用泛型,泛型的优点是什么?
1、通用性好,讲一个算法基于类型的不同而复用,避免代码膨胀。
例如一个加法,现在有int 和float两种类型,我们用泛型只需要写一遍即可。而不用泛型则需要俩种方法,当然也可以使用object,但是这样会造成装箱拆箱,影响效率。
2、类型安全,避免强制类型转换
3、性能较好、避免装箱操作
泛型约束是什么,有什么作用
在定义泛型类时,可以对客户端代码能够在实例化类时
用于类型参数(泛型)的类型种类施加限制。
如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。
这些限制称为约束。
约束是使用 where 上下文关键字指定的。
总结:限制类型参数代表的数据类型,让它只代表某类或者某些数据类型。
此处拿基类名做例子讲解。
此处提示报错,类型T中没有 CompareTo方法,因为这里没有使用泛型约束,编译器不知道你这个T类型是否有相对的方法,此时我们打开泛型约束,
进入IComparable中查看,发现有这个方法。我们调用的参数分别是int类型与float类型,这两个类都继承这个接口。
在这个Max的方法中,我们调用了比较的方法,泛型约束就是防止T没有该方法,软件运行则会报错。约束,就是约束你用这个T想做什么,阿么T中必须要有对应的方法,可以是继承自父亲或者接口,也可以是自身拥有的。
PS:泛型约束可以有多个,并且是与的关系。
常用的泛型约束
T:struct 类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。 有关更多信息,请参见 使用可以为 null 的类型(C# 编程指南)。
T:class 类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
T:new() 类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时, new() 约束必须最后指定。
T:<基类名> 类型参数必须是指定的基类或派生自指定的基类。
T:<接口名称> 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
常用的是基类名与接口名称,其他的用到的时候再查即可。