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

    学习永不止境,技术成就梦想。
  • 相关阅读:
    Window7下手动编译最新版的PCL库
    C和C++中的异常处理
    队列之卡片游戏
    C/C++笔记
    最真的梦——文/林清玄
    库函数与系统调用的区别
    hdu2653之BFS
    使用ffmpeg+crtmpserver搭建文件的伪直播
    ZOJ3705:Applications
    c_c++基础问题(平时读书时笔记)
  • 原文地址:https://www.cnblogs.com/zd1994/p/6730686.html
Copyright © 2011-2022 走看看