欢迎您来到“名字什么都是浮云”的博客空间!

C#高级编程9-第5章 泛型

泛型


 

1.泛型概述

泛型是C#的部分与中间语言IL集成。创建的类或方法指定了类型,在实例化和调用时必须指定类型进行操作。

泛型可以用于类、方法、接口和委托以及结构。

泛型也是结构,同时是运行库CLR定义也可以进行互操作。

 

使用泛型的优化是:

提供性能

类型安全

二进制代码重用

利于扩展

命名约定

 

性能

装箱是将值类型转换为值类型,拆箱就是将己转换为引用类型的值类型转换回来,装箱和拆箱是非常影响程序性能的,在代码中应避免装箱和拆箱的操作。使用泛型为实例化类型对象和调用时进行类型指定。就避免了这一操作。

 

上图中就使用了拆箱操作。强制转换为int类型,如果使用List<T>泛型集合则

直接获取值即可。

类型安全

泛型另一个特性是类型安全。在我们使用集合时,如果集合可以添加任意类型。那么在遍历集合元素时,很难获取到元素的类型,因此会造成类型转换失败。

上图中遍历,就会发生运行时异常。

如果使用int集合泛型,使用泛型添加其他类型的集合元素。则再编译时会提示异常。避免了运行时无法获知的错误。

二进制代码重用

泛型更好的重用二进制代码,泛型类通过一次定义,实现不同类型的实例化。

代码的扩展

在使用泛型进行不同类型实例化时,在IL代码中,JIT编译器会把泛型类编译为本地代码,会给每一个类型创建一个新类,引用类型共同享用同一个本地类中的所有相同的实现代码。

命名约定

泛型类型名称使用T作为前缀。List<T>,Dictionary<TKey,TValue>

 

2.创建泛型类

    

    

     

    

    

如果我们使用泛型进行创建:

    

    

    

    

    

    

   

3.泛型类的特性

泛型类型创始化赋值时,不能给null值;使用default(T)关键字。

    

如果泛型类需要调用泛型类型中的方法。则需要添加约束。

在使用泛型时,还可以合并多个约束

    

泛型类型可以实现泛型接口、也可以派生类,可以派生自泛型基类。要求是必须重复或指定基类的类型。

    

泛型类可以包含静态成员,泛型类的静态成员只能在类的一个实例中共享。

    

4.泛型接口

    

如果泛型类型用out关键字标注,那么泛型接口就是协变的。就是说返回类型只能是T

    

    

    

 

如果泛型类型用in关键字标注,那么泛型接口就是抗变得,就是说输入参数只能是T

    

    

 

5.泛型结构

与类相似,接口也可以是泛型的,在.NET中泛型结构是Nullable<T>,数据库的int字段是可以为空的,但是C#int字段是不能为空的。Nullable<T>支持了可以为null,可以根据hasValue来判断是否null,如果是null则抛出异常。Nullable<T>可空类型,它除了能定义null,它还能转换为基本类型,比如Nullable<int>可以转为int型。int型也可以转Nullable<int>.

    

    

    


    

    

    

6.泛型方法

泛型方法,方法名后面加上<T>,调用时传入类型。

带约束的泛型方法。

泛型类型可以使用where限制,同样方法也可以。

     

带委托的泛型方法。

     

      

 

posted @ 2017-05-08 15:53  名字什么都是浮云  阅读(191)  评论(0编辑  收藏  举报