• 关于泛型的简单备忘


    泛型的概念,有时候应用确实比较方便,尤其是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将为其产生一份独立的代码。

  • 相关阅读:
    专题三--1005
    专题三--1009
    专题三--1017
    背包九讲
    专题三--1003
    专题三--1004
    专题三--1015
    [洛谷P1220]关路灯
    [洛谷P1776]宝物筛选
    [USACO14JAN]Recording the Moolympics
  • 原文地址:https://www.cnblogs.com/simonhaninmelbourne/p/1525851.html
Copyright © 2020-2023  润新知