C#泛型

2021-07-10 08:08

阅读:419

标签:nim   构造函数   constrain   构造   派生类   interface   turn   return   实现   

泛型能实现逻辑的重复使用。C#提供5种泛型类、结构、接口、委托和方法。

1.声明泛型类

  声明泛型类和普通类差不多

        public class mytest{

      public T1 somevar=new T1();

      public T2 othervar=new T2();

    }

  构造类型则在构造函数中

    mytest{}

  变量声明:

    mytest t=new mytest();

    var t=new mytest();

2.用where语句进行约束

  关键字 约束列表

    where TypeParam : constraint , constraint

  类型参数

  共有五种类型参数:

  约束类型 描述

  类名 只有这个类型的类,或者继承这个类型

  class 任何引用类型,包括类、数组、委托和接口都可以用作类型实例

  struct 任何值类型都可以用作类型实参

  接口名 只有这个接口或实现这个接口

  new() 任何带有无参公共构造函数的类型。这叫做构造类型约束

3.泛型方法

  与其他泛型不一样方法是成员,可以在泛型与非泛型中实现

    public void PrintfData(S p,T t)where S:person{}

  调用泛型方法:

    Mymethod();

  推断类型,如果只有一个参数则

    public vod test(T t1);

    int t=5;

    test(t);

4.泛型接口

  interface IMyFc{

  T ReturnIt(T value);}

  class test:IMyfc{

  public S ReturnIt(S invalue){

    return invalue;}

5.可变性

  协变:( 需要添加关键字 out )能让基类泛型引用连接到派生类泛型引用,如果在有派生类关键字只需要加在派生类,逆变一样。

    class Animal{

      public int legs=4;}

    class Dog:Animal{}

    delegate T Factory();   

    class Program{

      static Dog MakeDog(){

      return new Dog();}       

    static void main(){

      Factorydog=d;

      Factoryani=dog;//报错

    }

  兼容性原则在这个例子不适用,俩个委托同级。我们需要一个Animal对象,返回一个dog的引用也可以变成Animal,但委托需要的是Animal,所以委托不匹配。如果派生类只用于输出值,这种结构化的委托有效性的常数之间关系叫做协变。

  在delegate T Factory();添加out参数

  逆变:(需要添加关键字 in)能够让派生类泛型连接基类泛型引用

    class Animal{

      public int legs=4;}

    class Dog:Animal{}

    delegate void Action();

    class Program{

      static void Anto(Animal a){

        Console.WriteLine(“{0}”,a.Legs);}

      static void main(){

      Actionact1=Anto;

      Action dog1=act1;

      dog1(new dog());

    }

  协变:因为像期望那样,调用获得了一个指向基类的引用。

  逆变:因为像期望那样,被调用的方法收到了一个基类的引用。

C#泛型

标签:nim   构造函数   constrain   构造   派生类   interface   turn   return   实现   

原文地址:https://www.cnblogs.com/dlvguo/p/9688412.html


评论


亲,登录后才可以留言!