zoukankan      html  css  js  c++  java
  • 学习笔记——泛型

    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

  • 相关阅读:
    java 06 作业代码
    java 06 abstract 抽象类
    java 06 重写(覆盖) final 内部类
    java 06 重写和final
    java 06 继承
    java 05 this static构造函数
    java 05 构造函数-构造代码块
    java 05 heap satck 堆和栈
    java 05 成员变量和成员函数-封装
    BJFU-207-基于顺序存储结构的图书信息表的逆序存储
  • 原文地址:https://www.cnblogs.com/lyyd/p/10076335.html
Copyright © 2011-2022 走看看