第十二章 泛型

1. 泛型优势:

源代码保护

类型安全

更加清晰的代码

更佳的性能.(减少装箱和拆箱的操作)

2. Wintellect 的Power Collections库

C++的标准模板库的部分集合类

3.泛型基础结构

开放类型和封闭类型

一个泛型的所有类型实参传递的都是实际的数据类型,则成为封闭类型.

具有泛型类型参数的类型成为开放类型,CLR禁止构造开放类型的实例.类似禁止构造接口实例.

如:var t=typeof(Dictionary<,>); var o=CreateInstance(t);这样是不行的.需要制定类型之后在构造.

CLR会为类型对象分配静态字段,对于泛型,List<string>和List<DateTime>,有各自的静态字段,是独立的.

如果一个程序集中使用 了List<string>,CLR只会为这个类型编译一次代码,一个完全不同的程序集加载进来的时候,也会使用这同一个编译过的代码.同时,CLR认为引用类型实参是完全相同的,CLR为List<string>方法编译的代码可以直接用于List<Stream>的方法.因为String和Stream均未引用类型,都是指向堆上的对象的指针.值类型则是专门生产本地代码.

逆变和谐变

in 逆变 意味着泛型类型参数可以从一个街垒更改为派生类

out协变 意味着泛型类型参数可以从一个派生类改为基类

如:public delegate TResult Func<in T,out TResult>

Func<Object,ArgumentException> fn1=null;

可以转型为Func<string,Exception>

泛型方法

CLR允许一个方法指定他独有的类型实参

如:

public class CustomOrder<T>
{
    private T _test;

    public TOutPut Order<TOutPut>(TOutPut inTest)
    {
        return inTest;
    }
}

泛型方法和类型推断

为了增强使用泛型时的可读性,C#编译器支持泛型类型推断,如:可以推断出value的类型.

public class CustomOrder
{

    public void Display<Tout>(Tout toDisplay)
    {

    }
}

public class UseTest
{
    public void Test()
    {
        var value = 10;
        new CustomOrder().Display(value);
        new CustomOrder().Display<int>(value);
    }
}

泛型类型的可验证问题

对于泛型类型,可以使用default(T),会初始化为null,或0.不能够直接设为null,如T s=null,是不行的,因为值类型是不能设为null的,除非T加了限定是引用类型.

直接对泛型类型进行强猴子转换也是不行的,如T value, var t=(int)value,是错误的.可以这样var t=(int)(object)value,但是虽然能通过编译,但很可能出错.

泛型变量,和null进行比较,如果为值类型,则永远为false.

不能直接对泛型参数用==比较,除非T被约束为class.

你可能感兴趣的:(泛型)