zoukankan      html  css  js  c++  java
  • C#泛型讲座(一)知识点

    由李建忠老师的讲座内容整理.

    所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型,泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。

    C#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。

    机制:
    C#泛型能力是由CLR在运行时支持,区别于C++的编译时模板机制,和Java的编译时的“搽拭法”。这使得泛型能力可以在各个支持CLR的语言之间进行无缝的互操作。
    C#泛型代码在被编译为IL代码和无数据时,采用特殊的占位符来表示泛型类型,并用专有的IL指令支持泛型操作。而真正的泛型实例化工作以"on-demand"的方式,发生在JIT编译时。

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

    C#泛型的几个特点:
    如果实例化泛型类型的参数相同,那么JIT编译器会重复使用该类型,因此C#的动态泛型能力避免了C++静态模板可能导致的代码膨胀的问题。

    C#泛型类型携带有丰富的元数据,因此C#的泛型类型可以应用于强大的反射技术。

    C#的泛型采用“基类,接口,构造器,值类型/引用类型”的约束方式来实现对类型能数的“显式约束”,提高了类型安全的同时,也丧失了C++模板基于“签名”的隐式约束所具有的高灵活性。

    泛型类型的成员:

    泛型类型的成员可以使用泛型类型声明中的类型参数,但类型参数如果没有任何约束,则只能在该类型上使用从System.Object继承的公有成员。

    泛型接口:
    泛型接口的类型参数要么已实例化,要么来源于实现类声明的类型参数。

    泛型委托:
    delegate bool Predicate<T>(T value);
    class x {
      static bool F(int i){..}
      static bool G(string s){..}
      static void Main()
     {
      Predicate<string> p2 = G;
      Predicate<int> p1 = new Predicate<int>(F);
     }
    }
    泛型委托支持在委托返回值和参数上应用参数类型,这些参数类型同样可以附带合法的约束。

    泛型方法简介:
    C#泛型机制只支持“在方法声明上包含类型参数”----即泛型方法
    C#泛型机制不支持在除方法外的其它成员(包括属性,事件,索引器,构造器,析构器)的声明上包含类型参数,但这些成员本身可以包含在泛型类型中,并使用泛型类型的类型参数
    泛型方法既可以包含在泛型类型中,也可以包含在非泛型类型中。
    public class Finder{
      public static int Find<T>(T[] items,T item){
     for(int i=0 ;i<items.Length;i++)
     {
       if(..) reutrn i;
     }
     return -1
    }
    }
    //泛型方法调用
    int i = Finder.Find<int>(new int[] {1,2,3,4,5},6);

    泛型约束简介:
    C#泛型要求对“所有泛型类型或泛型方法的类型参数”的任何假定,都要基于“显式的约束”,以维护C#所要求的类型安全。
    “显式约束”由where 子句表达,可以指定“基类约束”,“接口约束”,“构造器约束”,“值类型/引用类型约束”共4种约束。
    “显式约束”并非必须,如果没有指定“显式约束”,泛型类型参数将只能访问System.Object类型中的公有方法。
    以下是4种不同约束的介绍截图


  • 相关阅读:
    bzoj 1176 cdq分治套树状数组
    Codeforces 669E cdq分治
    Codeforces 1101D 点分治
    Codeforces 1100E 拓扑排序
    Codeforces 1188D Make Equal DP
    Codeforces 1188A 构造
    Codeforces 1188B 式子转化
    Codeforces 1188C DP 鸽巢原理
    Codeforces 1179D 树形DP 斜率优化
    git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题
  • 原文地址:https://www.cnblogs.com/hjf1223/p/222970.html
Copyright © 2011-2022 走看看