1、泛型Tc#
这个T在实际使用中很常见,好比List<T>。其实咱们还能够写成List<object>。可是这样写会有一个问题。好比我把一个int数据存入到一个List<object>集合中,int则会被自动转成object,当咱们试图取取用这个int数据的时候,咱们还要把object转成int。这期间有一个转换,int=》object=》int,这个转换涉及到拆箱和封箱操做,也就是引用类型到值类型或者值类型到引用过程转换的过程,这个是很耗时的。当数据量大的时候,这个对于代码的效率是有不可忽视的影响的。.net
同时,若是不当心把一个string类型存入到了这个List<object>中,系统是不会报错的。可是当要取用的时候,你也许开始没发现不当心存入了一个string类型,而后你想固然的认为它是一个int类型,把它转成了int,这个时候你的程序就要报错了。这也是一个问题。blog
这个时候使用List<object>的隐患就显现出来了。为了比较好的解决这两个问题,c#引入了T这个概念,由于在大部分场景下,咱们的类型都是肯定的,不必用object。继承
当咱们使用List<T>的时候,咱们首先实例化一个List<T>,好比这样的代码:接口
List<string> list=new List<string>();编译器
这个代码的意思是告诉list这个集合只能放string这个类型的数据,放其余类型的数据,编译器是会报错的。这样咱们不难理解,T这个东西的做用,其实就是一个通用的容器,制造它的人开始不指定它是用来装什么的,而使用者在使用它的时候要告诉这个容器准备用来装什么,容器知道了用来装什么以后,后面全部存入操做,它都要检查一下你放的东西是否是开始指定的东西类型。string
2、泛型方法io
如今有一个需求,须要写一个方法,这个方法传入的参数多是int型的,也多是string型的。首先咱们能够用方法的重载方案解决这个问题,好比下面两个重载方法:编译
public void test(int param)
{ }
public void test(string param)
{ }class
可是这样的话若是支持的类型变多了,那么你须要写不少重载方法。若是只写一个重载方法,则能够写成
public void test(object param) { }
可是这样写又出现object转成其余类型的问题,会带来效率损失。同时不检查类型,一旦传入了不支持的类型,可能会出问题。
如今把test方法改造一下,这样写:
public void test<T>(T param){ }
这样写以后,使用的时候要求提早通知这个方法,你传入的是什么类型,即:
test<int>(10);
若是写成 test<int>("10");编译器就会报错。
这就是泛型方法。这里面咱们省略了方法内部的实现,其实仔细想一下,若是要在这样的方法里面添加业务代码,彷佛除了用于存放数据的集合以外,并无多少场景须要这么写方法。没错,泛型这个东西最经常使用的应用场景就是数据集合。而List<T>就是一个存放各类数据的泛型类。
3、泛型类
上面的方法:public void test<T>(T param){ },咱们能够尝试一下把<T>去掉,只写成public void test(T param){ }看看会发生什么。你会发现编译器会报错,那么咱们再尝试一下在这个方法的类名上加上<T>,即写成:
class TClass<T>
{
public void test(T param)
{ }
}
你会发现,若是把<T>放到类名上,里面的方法就不须要加 <T>了,同时编译器也不会报错。这是一种比较简洁的写法。这个时候,TClass这个类就是泛型类,而它的构造方法,则和普通的类的构造方法的写法是同样的。当你要实例化这个类型的时候,必须告诉这个类型T表明哪一个类型,以后,全部这个类里面被标识了T的地方,都是指你开始实例化指明的类型。好比test这个方法里面传入的param,必定要和你开始实例化这个类的时候指明的类型一致。再好比你写一个返回T的方法: public T returnTest() { },这个方法的返回值也必须是你实例化类时指明的类型。若是咱们TClass改为List,把test改为Add,则方法变成了下面这样
class List<T>
{
public void Add(T param)
{ }
}
这不就是咱们常常用的List<T>这个泛型集合吗。固然它的内部实现还有不少东西,这里咱们不去关注。
4、有了泛型类的概念,泛型接口就很好理解了,给上面的TClass写一个接口进行规范:
interface ITClass<T>
{
void test(T param);
}
上面讲的TClass继承这个接口就能够了:
class TClass<T> : ITClass<T> { public void test(T param) { throw new NotImplementedException(); } }————————————————版权声明:本文为CSDN博主「returnTrue999」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。原文连接:https://blog.csdn.net/dap769815768/article/details/81946506