• 【c#基础】泛型


    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位系统),就可以引用一个类型。值类型包含在实例化的泛型类的内存中,同时因为每个值类型对内存要求都不同,所以要为每个值类型实例化一个新类。

     泛型命名要点:

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

    协变和抗变

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

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

    参数类型协变:

    感觉文档说错了

    自己理解如下:

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

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

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

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

    方法返回类型是抗变的:

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

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

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

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

    泛型接口的抗变:

    用In关键字标识

     泛型结构

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

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

    泛型方法也可以重载

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

  • 相关阅读:
    tcpdump分析tcp连接的建立、传输和关闭
    链表排序:冒泡和快排
    linux文件IO操作篇 (一) 非缓冲文件
    linux文件操作篇 (四) 目录操作
    linux文件操作篇 (三) 文件状态和操作属性
    linux文件操作篇 (二) 打开和关闭文件
    linux文件操作篇 (一)文件属性与权限
    linux编程(三)多线程
    linux编程(二)进程
    linux编程(一)文件IO 目录
  • 原文地址:https://www.cnblogs.com/SignX/p/11029356.html
Copyright © 2020-2023  润新知