zoukankan      html  css  js  c++  java
  • 泛型

    一,泛型的优势

    1,源代码保护
    使用泛型算法的开发人员不需要访问算法的源代码。然而,使用c++模板的泛型技术时,算法的源代码必须提供给准备使用算法的用户
    2,类型安全
    将泛型算法应用于一个具体的类型时,编译器和CLR能理解开发人员的意图,并保证只有与指定数据类型兼容的对象才能用于算法。试图使用不兼容的类型的对象会造成编译时错误,或在运行时抛出异常。
    3,更清晰的代码
    由于编译器强制类型安全性,所以减少了源代码中必须进行的强制类型转换次数,使代码更容易编写和维护。
    4,更佳的性能
    将泛型算法应用于一个具体的类型,避免了值类型存在装箱拆箱的操作

    二、开放类型和封闭类型

    1,具有泛型类参数的类型称为开放类型,CLR禁止构造开放类型的任何实例。
    2,代码引用泛型类型时可指定一组泛型类型实参。为所有类型参数都传递了实际的数据类型,类型就称封闭类型。CLR允许构造封闭类型的实例

    //实例开放类型(失败)
    Type t = typeof (Dictionary<,>);
    Activator.CreateInstance(t);
    
    //实例封闭类型(成功)
    Type t2 = typeof(Dictionary<string, string>);
    Activator.CreateInstance(t);
    
    
    //Dictionary:类型名
    //2:类型有2个元数
    //TKey,TValue:要求为TKey,TValue2个类型参数指定具体的类型
    //System.Collections.Generic.Dictionary'2[TKey,TValue]
    View Code

    三、逆变和协变

    1,不变量:意味着泛型类型参数不能改变
    2,逆变量:意味着泛型类型参数可以从一个类更改为它的某个派生类。使用in关键字标记。逆变量泛型类型参数只能出现在输入位置,比如作为方法的参数
    3,协变量:意味着泛型类型参数可以从一个类型改变为它的某个基类。使用out关键字标记。协变量泛型类型参数只能出现在输出位置,比如作为方法的返回类型

    四、约束

    1,主要约束
    主要约束可以是代表非密封类的一个引用类型,两个特殊的主要类型:class和struct

    2,次要类型
    次要约束代表接口类型。这种约束想编译器承诺类型实参实现了接口

    3,构造器约束
    class a<T> where T:new(){}

    4,将泛型类型变量设为默认值
    class a<T> where T:new(){ T temp=default(T)}
    如果T是引用类型,就将temp设为null;是值类型则设为0

    学习永不止境,技术成就梦想。
  • 相关阅读:
    关于数据库的压测(window+liunx)
    参数化关联----三种方式
    jmeter的使用
    day07----------移动端测试
    day07----------Charles抓取web端的HTTPS协议下载和七个功能操作
    CURL 运用
    有关数据库的导出导入备份
    同时删除多张表的数据
    一条sql语句update 多条记录
    linux 将一个服务器上的文件或文件夹拷贝到另一个服务器上(转载)
  • 原文地址:https://www.cnblogs.com/zd1994/p/6730686.html
Copyright © 2011-2022 走看看