zoukankan      html  css  js  c++  java
  • C#泛型

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

    1.声明泛型类

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

            public class mytest<T1,T2>{

          public T1 somevar=new T1();

          public T2 othervar=new T2();

        }

      构造类型则在构造函数中

        mytest<int,long>{}

      变量声明:

        mytest<int,long> t=new mytest<int,long>();

        var t=new mytest<int,long>();

    2.用where语句进行约束

      关键字 约束列表

        where TypeParam : constraint , constraint

      类型参数

      共有五种类型参数:

      约束类型 描述

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

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

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

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

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

    3.泛型方法

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

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

      调用泛型方法:

        Mymethod<short,int>();

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

        public vod test<T>(T t1);

        int t=5;

        test(t);

    4.泛型接口

      interface IMyFc<T>{

      T ReturnIt(T value);}

      class test<S>:IMyfc<S>{

      public S ReturnIt(S invalue){

        return invalue;}

    5.可变性

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

        class Animal{

          public int legs=4;}

        class Dog:Animal{}

        delegate T Factory<T>();    <—factory委托

        class Program{

          static Dog MakeDog(){

          return new Dog();}       <—符合Factory委托

        static void main(){

          Factory<Dog>dog=d;

          Factory<Animal>ani=dog;//报错

        }

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

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

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

        class Animal{

          public int legs=4;}

        class Dog:Animal{}

        delegate void Action<in T>(); <-in 逆变关键字

        class Program{

          static void Anto(Animal a){

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

          static void main(){

          Action<Animal>act1=Anto;

          Action<DOg> dog1=act1;

          dog1(new dog());

        }

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

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

  • 相关阅读:
    更精确地计量程序执行时间(转)
    C++中计算代码的执行时间
    VC实现文件拖拽
    统计程序运行时间的C++源代码
    C++开源库详细介绍
    C++高精度实现计算程序运行时间
    c++计算代码执行时间的方法,毫秒级
    【转】mysql 分析查找执行效率慢的SQL语句
    Chapter 10: Proxy Routing
    Enable remote access to MySQL database server
  • 原文地址:https://www.cnblogs.com/dlvguo/p/9688412.html
Copyright © 2011-2022 走看看