【c#基础】泛型

摘要:
泛型类使用泛型类型保证了类型安全。泛型类泛型方法泛型接口、结构、委托泛型优点:1:性能装箱和拆箱很容易使用,但性能损失比较大。泛型类可以定义一次,并且可以用去多不同的类型实例化。值类型包含在实例化的泛型类的内存中,同时因为每个值类型对内存要求都不同,所以要为每个值类型实例化一个新类。

1:减少代码的选项可以是用Object类,也可以使用泛型

但是Object类进行类型传递不是类型安全的。泛型类使用泛型类型保证了类型安全。

泛型类泛型方法泛型接口、结构、委托

泛型优点:

1:性能

装箱和拆箱很容易使用,但性能损失比较大。

泛型的话在编译的时候就会动态生成我们定义他的类型,这样就不用进行装箱和拆箱。

var list=new List<int>();

上面这一句的话编译的时候就会编译成对应的int类型了,所以在运行的时候不用在进行装拆箱操作了。

2:类型安全

就是说你定义了一个List<int>()这边只能添加int类型的数据不允许你添加其他类型,向ArrayList()就可以同时添加int string等不同类型。这样在调用的时候如果定义的是int类型,但是取到的是string类型这样运行就会报错。

3:二进制代码的重用

泛型允许更好的重用二进制代码。泛型类可以定义一次,并且可以用去多不同的类型实例化。

4:代码扩展

泛型类的定义会放在程序集中,所以用特定泪I型那个实例化泛型类不会在IL代码中复制这些类。

在JIT编译器把泛型类编译为本地代码时,会给每个类型创建一个新类,引用类型共享同一个本地类的所有相同实现代码,因为引用类型在实例化的泛型类中只需要4个字节内存地址(32位系统),就可以引用一个类型。值类型包含在实例化的泛型类的内存中,同时因为每个值类型对内存要求都不同,所以要为每个值类型实例化一个新类。

泛型命名要点:

【c#基础】泛型第1张

当要给一个泛型赋默认值的时候可以使用default(T);当是引用类型的话就会默认值为null,值类型的话默认值就是0.

协变和抗变

通过协变和抗变(逆变)为泛型接口和泛型委托添加了扩展。

协变和抗变是指对返回值和参数的类型进行转换。

参数类型协变:

感觉文档说错了

自己理解如下:

协变是和谐的转化类似于装箱string->object,协变是对返回值类型进行转换,用out来标识 ->out输出结果,也就是返回值。

抗变是不和谐的转化 类似于拆箱object->string,抗变对参数类型进行转化,用in来标识->in 输入 ,也就是输入参数

例如:就是如果定义一个基类Shape和子类Rectangle,有一个方法以Sharp作为参数

但是作为shape基类的子类Rectangle可以作为参数传递给这个方法。

【c#基础】泛型第2张

方法返回类型是抗变的:

当方法返回一个Shape,不能把它赋于Rectangle,因为Shape不一定总是Retangle.反过来是可行的。

【c#基础】泛型第3张

原先.Net4之前泛型是不支持协变和抗变的,之后就在支持了,但是使用方式有点不一样

泛型类型用out关键字标注,泛型接口就是协变的。这意味着返回类型只能是T.

接口IIndex于类型T是协变的,并从一个自读索引器中返回这个类型

【c#基础】泛型第4张

泛型接口的抗变:

用In关键字标识

【c#基础】泛型第5张

泛型结构

与类一样,结构也可以是泛型,只是没有继承特性。

泛型结构Nullable<T>.通常就是可空符号 ?和空合并运算符 ??

泛型方法也可以重载

泛型方法所调用的方法是在编译期间就已经定义了,而不是运行期间。

免责声明:文章转载自《【c#基础】泛型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇.Net Core官方的 JWT 授权验证IIS自动安装程序(免费)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.net系统自学笔记——泛型

泛型 1.概述 2.创建泛型类 3.泛型类的特点 4.泛型接口 5.泛型结构 6.泛型方法 一、概述 泛型是CLR定义的,所以支持.net的语言就支持泛型。 优缺点: 1.性能 2.类型安全 3.二制代码重用 4.代码的扩展 5.命名约定 (一)、性能 名词:装箱,拆箱。(性能损失) System.Collections.Generic名称空间中的List...

Java小结

反射 java数据类型分为原始类型和引用类型。对于每种类型的对象java虚拟机会实例化不可变的java.lang.Class对象,它提供了在运行时检查对象属性的方法,这些属性包括它的成员和类型信息。 注:Class是泛型类,可以使用@SuppressWarnings("unchecked")忽略泛型或者使用Class<?>类型,?表示任意类...

C#值类型和引用类型

转自:https://www.cnblogs.com/bakuhert/articles/5878086.html 什么是值类型,什么是引用类型 概念:值类型直接存储其值,而引用类型存储对其值的引用。部署:托管堆上部署了所有引用类型。 引用类型:基类为Objcet 值类型:均隐式派生自System.ValueType: 值类型: byte,short,...

用JS实现回文数的精准辨别!!!

笔者最近在一边看《JS高级程序设计3》一边在FCC上找题目练习啊。那叫一个爽。这不,刚刚用生命在课堂,寝室,实验室,图书馆等各种场所将第五章“引用类型”搞定,FCC便知趣的给笔者来了个“回文数”,笔者咬牙切齿,花了两天时间,又是研究数组,又是研究字符串,又是研究作用域,还看了很长时间的正则表达式。还好,不负有心人,嘿嘿嘿,现在为大家详细分享用JS实现精准回...

Java 泛型小结

1、什么是泛型?   泛型(Generics )是把类型参数化,运用于类、接口、方法中,可以通过执行泛型类型调用 分配一个类型,将用分配的具体类型替换泛型类型。然后,所分配的类型将用于限制容器内使用的值,这样就无需进行类型转换,还可以在编译时提供更强的类型检查。    2、泛型有什么用?   泛型主要有两个好处:   (1)消除显示的强制类型转换,提高代...

C# 数据类型

C#的数据类型可以分为3类:数值类型,引用类型,指针类型.指针类型仅在不安全代码中使用.值类型包括简单类型(如字符型,浮点型和整数型等),集合类型和结构型.引用类型包括类类型,接口类型,代表类型和数组类型.值类型和引用类型的不同之处是值类型的变量值直接包含数据,而引用类型的变量把它们的引用存储在对象中.对于引用类型的变量,完全有可能让两个不同的变量引用同一...