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

    学习永不止境,技术成就梦想。
  • 相关阅读:
    Netty源码分析--Channel注册(上)(五)
    Netty源码分析--初始化Options,添加处理器(四)
    Netty源码分析--创建Channel(三)
    【2015 Week Task】
    【Mood 20】DailyBuild 4月
    【Gradle】 Gradle 综合
    【JS 综合】JS综合
    【IOS】IOS综合
    【起航计划 001】2015 起航计划 踏在起跑线上
    【HTML5】HTML5 综合
  • 原文地址:https://www.cnblogs.com/zd1994/p/6730686.html
Copyright © 2011-2022 走看看