zoukankan      html  css  js  c++  java
  • 关于泛型的简单备忘

    泛型的概念,有时候应用确实比较方便,尤其是CLASS中的应用。

    1. 定义类

    Code

     2. 约束

    约束是使用 where 上下文关键字指定的。基本的六种类型的约束:

    约束                      说明
    T:结构                类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。
    T:类                  类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
    T:new()              类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
    T: <基类名>            类型参数必须是指定的基类或派生自指定的基类。
    T: <接口名称>          类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
    T:U                  为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。

    就可以:

    public class EmployeeListList<T> where T : Employee
    {
    //your code here ...
    }

     也可以:

    class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
    {
    // to do...
    }

    3. 机制

    C#泛型机制:C#泛型能力由CLR在运行时支持,区别于C++的编译时的模版机制、和JAVA的编译时的“搽试法”,这使得C#泛型能力可以再各个支持CLR的语言之间进行无缝的互操作。

    C#泛型编译机制
    1:第一轮编译时,编译器只为stack产生“泛型版”的IL代码和元数据,并不进行泛型类型的实例化,T在中间值充当占位符。
    2:JIT编译时,当JIT编译器第一次遇到stack时,将用int类型替换“泛型版”IL代码和元数据中的T进行泛型类型的实例化。
    3:CLR为所有类型参数为“引用类型的”的泛型类型产生痛一份代码,但如果类型参数是“值类型”,对每个不同的“值类型”CLR将为其产生一份独立的代码。

  • 相关阅读:
    jQuery removeAttr() 源码解读
    jQuery attr() 源码解读
    jQuery access()方法
    为页面添加favicon
    关于CSS3 object-position/object-fit属性的使用
    使用jQuery判断元素是否在可视区域
    使用canvas实现环形进度条
    使用css3实现瀑布流布局效果
    js判断元素滑动方向(上下左右)移动端
    绝对定位元素实现水平垂直居中
  • 原文地址:https://www.cnblogs.com/simonhaninmelbourne/p/1525851.html
Copyright © 2011-2022 走看看