码迷,mamicode.com
首页 > 其他好文 > 详细

2018-7-26-随笔-泛型

时间:2018-07-26 10:46:41      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:就会   模板   关系   直接   情况   类的变量   调用   ===   str   

类型不是对象,而是对象的模板

泛型不是类型,而是类型的模板

泛型:

1.c#中的泛型只在类、结构、接口、委托、方法中有

泛型类:

创建“构造类型”===就是给”类型参数“赋予”类型实参“

泛型类的构造出的类型都是不同的并且相互独立的

泛型的使用使得代码减少便于维护,但是不容易写,因为太抽象

类型参数的约束:

就是给泛型的“T”一个限定条件,让编译器知道什么类型可以用什么类型不可以用-------约束

泛型中不能处理一些类型的对象,或者不是object的派生类,否则会报错

where语句:

约束都是用where语句列出的,多个约束就用逗号分隔。  多个where语句间没有什么间隔符

where语句没有任何的次序,但是语句的内部有严格的顺序:类名---class(引用类型)---struct(值类型)---接口名---new()(无参构造的类型)

主约束只能有一个(前三个),接口可以有多个,构造约束只能放在最后。

泛型方法:

可以在泛型和非泛型的类、接口、结构中 

泛型方法也可以有约束子句,

泛型方法中如果泛型方法的方法参数和泛型参数一样,在实例调用时就可以不用写出泛型的实参类型

例如:

public void MyMethod <T> (T myVal){}

int myInt = 2;

MyMethon<int>(myInt);-------------正常书写

MyMethon(myInt);----------------简写,推断类型,这样书写编译器可以推断出这个方法的泛型和方法参数是一样的,所以不用写出来了。

泛型类和扩展方法:

理解:在使用一个类时,先定义个静态类(static)类,在这个类中书写一个静态方法(static),方法的参数就是以要使用类类型,不过必须要有this关键字(this Holder<T> h),然后在我们实例要使用的类,就可以直接类的对象调用才写的类方法。调用时不需要参数的,因为就是这个类型对象调用的。

泛型结构:

和泛型类一样

泛型委托:

参数类型<形参类型,返回值类型>,也可以有约束条件

C#中的两个泛型委托:FUNC(T,result)有返回值的  Action(T)没有返回值的

泛型接口:

泛型的接口,要不是方法参数“泛型”,要不就是返回值”泛型“,要不就是都”泛型“

泛型接口最好是泛型类来实现,如果是非泛型类实现,就会在实现的时候写明一个唯一的类型实参(那还定义泛型干嘛)!!!

泛型接口名称和非泛型接口名称不会冲突的

实现泛型接口时要注意防止出现类型实参相同的情况,否则会出现方法一样的情况出现报错

协变:

派生类对象可以赋值给基类的变量这是赋值兼容性。 派生类的引用赋值给基类变量

当派生类的委托实现赋值,再把派生类的委托赋值给基类的委托,发现这个是不行的!!!!因为这是两个委托,理论上是两个不一样的委托没有什么关系的。没有继承关系的,这时的赋值是不会成功的。这是的同级使得不能赋值。在泛型委托中的泛型参数中加”out“,就可以编译成功。

这样的只用返回值类的类型参数的皆可用派生类创建的委托类型 叫做协变

在泛型参数中用”in“,并且委托是只有泛型参数的,叫做逆变

2018-7-26-随笔-泛型

标签:就会   模板   关系   直接   情况   类的变量   调用   ===   str   

原文地址:https://www.cnblogs.com/liuqifeng/p/9370143.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!