学习笔记——泛型

1.泛型定义

泛型(Generic)是C#2.0推出的新语法,他提供了一种更准确的使用一种以上的类型代码的方式。泛型允许开发人员声明类型参数化的代码,开发人员可以用不同的类型进行实例化。通俗的讲,就是一个方法可以传入不同类型的参数,可以执行相同的算法。

在C#1.0时,我们可以通过Object类型来实现同样的功能,但是此过程存在的装箱、拆箱会损耗程序的性能。

2.泛型作用

为了满足不同类型,相同代码的重用

3.泛型参数

泛型方法声明的时候,没有指定类型,而是在调用的时候指定。

泛型是延迟声明的:即定义的时候没有指定具体的参数类型,把参数类型的声明推迟到了调用的时候才指定参数类型。 延迟思想在程序架构设计的时候很受欢迎。例如:分布式缓存队列、EF的延迟加载等等。

编译器编译泛型时会做相应的处理(生成占位符),调用的时候,会把占位符替换成具体的数据类型。

3.泛型实现形式

3.1.泛型类

    /// <summary>

     /// 泛型类

     /// </summary>

     /// <typeparam name="T"></typeparam>

     public class GenericClass<T>

     {

         public T _T;

     }

 // T是int类型
 GenericClass<int> genericInt = new GenericClass<int>();
 genericInt._T = 123;

3.2.泛型接口

     /// <summary>
     /// 泛型接口
     /// </summary>
     public interface IGenericInterface<T>
     {
         //泛型类型的返回值
         T GetT(T t);
     }

3.3.泛型委托

public delegate void SayHi<T>(T t);//泛型委托
 

4.调用

4.1.调用要指明类型

     /// <summary>
     /// 使用泛型的时候必须指定具体类型,
     /// 这里的具体类型是int
     /// </summary>
     public class CommonClass :GenericClass<int>
     {
     }

4.2.如果继承的子类也是泛型,可以不指明具体类型

     /// <summary>
     /// 子类也是泛型的,继承的时候可以不指定具体类型
     /// </summary>
     /// <typeparam name="T"></typeparam>
     public class CommonClassChild<T>:GenericClass<T>
     { 
     }

4.3.泛型接口实现

     /// <summary>
     /// 必须指定具体类型
     /// </summary>
     public class Common : IGenericInterface<string>
     {
         public string GetT(string t)
         {
             throw new NotImplementedException();
         }
     }
 
     /// <summary>
     /// 可以不知道具体类型,但是子类也必须是泛型的
     /// </summary>
     /// <typeparam name="T"></typeparam>
     public class CommonChild<T> : IGenericInterface<T>
     {
         public T GetT(T t)
         {
             throw new NotImplementedException();
         }
     }

5.泛型约束

泛型约束,实际上就是约束的类型T。使T必须遵循一定的规则。

泛型约束实现:只需要where关键字,加上约束的条件。

6.泛型的协变、逆变

协变和逆变是在.NET 4.0的时候出现的,只能放在接口或者委托的泛型参数前面,out 协变covariant,用来修饰返回值;in:逆变contravariant,用来修饰传入参数。

参考资料:https://www.cnblogs.com/dotnet261010/p/9034594.html

猜你喜欢

转载自www.cnblogs.com/lyyd/p/10076335.html