zoukankan      html  css  js  c++  java
  • 第十二章 泛型

    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.

  • 相关阅读:
    [React]核心概念
    [算法]复杂度分析
    [算法]移除指定元素&strSr()的实现
    [算法]合并链表&删除数组重复项
    php _weakup()反序列化漏洞
    Java 注解详解
    MyBatis入门
    Spring 事务管理
    Spring AOP
    Spring JDBC
  • 原文地址:https://www.cnblogs.com/zhangliming/p/3472886.html
Copyright © 2011-2022 走看看