• 泛型


    .net自从2.0版本就开始支持泛型,泛型不仅是c#语言的一部分,而且与程序集中的IL代码紧密地集成。有了泛型,就可以创建独立于被包含类型的类和方法了,我们不必给不同的类型编写功能相同的许多方法或类,只创建一个方法或类即可。另一个减少代码的选项是使用object类,但object类不是类型安全的。泛型类使用泛型参数,并可以根据需要用特定的类型替换泛型类型。这就保证了类型安全性:如果某个类型不支持泛型类,编译器就会出现错误。

                                           泛型就是延迟赋予类型定义
    

    a.性能:
    泛型的一个主要优点就是性能。值类型存储在栈上,引用类型存储在堆上。对值类型使用非泛型集合类,在把值类型转换为引用类型,和把引用类型转换为值类型时,需要进行装箱和拆箱操作。这样的操作性能损失比较大,遍历许多项时尤其如此。使用泛型就可以避免这样装箱和拆箱的动作。
    b.类型安全:
    使用泛型可以确保类型安全
    c.二进制代码重用:
    泛型允许更好地重用二进制代码。泛型类可以定义一次,并且可以用许多不同的类型实例化。不需要像c++模板那样访问源代码。
    d.代码扩展:
    在用不同的特定类型实例化泛型时,会创建多少代码?因为泛型类型的定义会放在程序集中,所以用特定类型实例化泛型类不会再IL代码中复制这些类。但是,在JIT编译器把泛型类编译为本地代码时,会给每个值类型创建一个新类。引用类型共享同一个本地类的所有相同的实现代码。这是因为引用类型在实例化的泛型类中只需要4个字节(32位系统),就可以引用一个引用类型。值类型包含在实例化的泛型类的内存中,同时因为每个值类型对内存的要求不同,所以要为每个值类型实例化一个新类。
    e.命名约定:
    如果在程序中使用泛型,在区分泛型类型和非泛型类型时就会有一定的帮助。1、泛型类型的名称用字母T作为前缀。2、如果没有特殊要求,泛型类允许用任意类替代,且只使用了一个泛型类型,就可以用字母T作为泛型类型的名称。

             public class List<T>
    

    3、如果泛型类型有特定的要求(例如,它必须实现一个接口或派生自基类),或者使用了两个或多个泛型类型,就应给泛型类型使用描述性的名称:

             public  class SortedList<TKey,TValue>
    

    泛型支持几种约束类型:
    where T:struct 对于结构约束,类型T必须是值类型
    where T:class 对于类约束,类型T必须是引用类型
    where T:IFoo 指定类型T必须实现接口IFoo
    where T:Foo 指定类型T必须派生自基类Foo
    where T:new() 这是一个构造函数约束,指定类型T必须有一个默认构造函数
    where T1:T2 这个约束也可以指定,类型T1派生自泛型类型T2.该类型约束也称为裸类型约束
    如:public calss MyClass where T:IFoo,new()

  • 相关阅读:
    [ZZ] Valse 2017 | 生成对抗网络(GAN)研究年度进展评述
    [ZZ] 多领域视觉数据的转换、关联与自适应学习
    [ZZ] 深度学习三巨头之一来清华演讲了,你只需要知道这7点
    [ZZ] 如何在多版本anaconda python环境下转换spyder
    支持向量机(Support Vector Machine,SVM)
    Wavelet Ridgelet Curvelet Contourlet Ripplet
    新技术革命思潮
    [ZZ] 边缘检测 梯度与Roberts、Prewitt、Sobel、Lapacian算子
    [ZZ] matlab中小波变换函数dwt2和wavedec2 系数提取函数appcoef2和detcoef2
    [综] 卷积的物理意义
  • 原文地址:https://www.cnblogs.com/caozhengze/p/10013120.html
Copyright © 2020-2023  润新知