深圳网站设计公司如何,网站常用字号,郑州网站开发的公司,火星建站免费wap自助建站https://blog.csdn.net/dap769815768/article/details/81946506
只是比较简单的解释#xff0c;在实际使用中#xff0c;如果遇到需要深入研究的场景#xff0c;再翻阅相关资料深入研究下。
一、泛型T
这个T在实际使用中很常见#xff0c;比如ListT。其实我们还…https://blog.csdn.net/dap769815768/article/details/81946506
只是比较简单的解释在实际使用中如果遇到需要深入研究的场景再翻阅相关资料深入研究下。
一、泛型T
这个T在实际使用中很常见比如ListT。其实我们还可以写成Listobject。但是这样写会有一个问题。比如我把一个int数据存入到一个Listobject集合中int则会被自动转成object当我们试图取取用这个int数据的时候我们还要把object转成int。这期间有一个转换int》object》int这个转换涉及到拆箱和封箱操作也就是引用类型到值类型或者值类型到引用过程转换的过程这个是很耗时的。当数据量大的时候这个对于代码的效率是有不可忽视的影响的。
同时如果不小心把一个string类型存入到了这个Listobject中系统是不会报错的。但是当要取用的时候你也许开始没发现不小心存入了一个string类型然后你想当然的认为它是一个int类型把它转成了int这个时候你的程序就要报错了。这也是一个问题。
这个时候使用Listobject的隐患就显现出来了。为了比较好的解决这两个问题c#引入了T这个概念因为在大部分场景下我们的类型都是确定的没必要用object。
当我们使用ListT的时候我们首先实例化一个ListT比如这样的代码
Liststring listnew Liststring();
这个代码的意思是告诉list这个集合只能放string这个类型的数据放其他类型的数据编译器是会报错的。这样我们不难理解T这个东西的作用其实就是一个通用的容器制造它的人开始不指定它是用来装什么的而使用者在使用它的时候要告诉这个容器准备用来装什么容器知道了用来装什么之后后面所有存入操作它都要检查一下你放的东西是不是开始指定的东西类型。
二、泛型方法
现在有一个需求需要写一个方法这个方法传入的参数可能是int型的也可能是string型的。首先我们可以用方法的重载方案解决这个问题比如下面两个重载方法 public void test(int param) { } public void test(string param) { }
但是这样的话如果支持的类型变多了那么你需要写很多重载方法。如果只写一个重载方法则可以写成 public void test(object param) { }
但是这样写又出现object转成其他类型的问题会带来效率损失。同时不检查类型一旦传入了不支持的类型可能会出问题。
现在把test方法改造一下这样写 public void testT(T param){ }
这样写之后使用的时候要求提前通知这个方法你传入的是什么类型即
testint(10);
如果写成 testint(10);编译器就会报错。
这就是泛型方法。这里面我们省略了方法内部的实现其实仔细想一下如果要在这样的方法里面添加业务代码似乎除了用于存放数据的集合之外并没有多少场景需要这么写方法。没错泛型这个东西最常用的应用场景就是数据集合。而ListT就是一个存放各种数据的泛型类。
三、泛型类
上面的方法public void testT(T param){ }我们可以尝试一下把T去掉只写成public void test(T param){ }看看会发生什么。你会发现编译器会报错那么我们再尝试一下在这个方法的类名上加上T即写成 class TClassT { public void test(T param) { } }
你会发现如果把T放到类名上里面的方法就不需要加 T了同时编译器也不会报错。这是一种比较简洁的写法。这个时候TClass这个类就是泛型类而它的构造方法则和普通的类的构造方法的写法是一样的。当你要实例化这个类型的时候必须告诉这个类型T代表哪个类型之后所有这个类里面被标识了T的地方都是指你开始实例化指明的类型。比如test这个方法里面传入的param一定要和你开始实例化这个类的时候指明的类型一致。再比如你写一个返回T的方法 public T returnTest() { }这个方法的返回值也必须是你实例化类时指明的类型。如果我们TClass改成List把test改成Add则方法变成了下面这样 class ListT { public void Add(T param) { } }
这不就是我们经常用的ListT这个泛型集合吗。当然它的内部实现还有很多东西这里我们不去关注。
四、有了泛型类的概念泛型接口就很好理解了给上面的TClass写一个接口进行规范 interface ITClassT { void test(T param); }
上面讲的TClass继承这个接口就可以了 class TClassT : ITClassT { public void test(T param) { throw new NotImplementedException(); } }