• 记录C#泛型


    常见的泛型类型

    泛型类
    class MyClass<T>
    {
        //......
    }
    
    泛型接口
    interface  GenericInterface<T>
    {
        void  GenericMethod(T t);
    }
    
    泛型方法
    public void MyGenericMethod<T>()
    {
         //......
    }
    
    泛型数组
    public T[] GenericArray;
    
    泛型委托
    public delegate TOutput GenericDelagete<TInput, TOutput>(TInput input);
    
    泛型结构
    struct MyGenericStruct<T>
    {
    
    }

    泛型约束

      约束   说明
      T:结构   类型参数必须是值类型
      T:类   类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
      T:new()   类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。
      T:<基类名>   类型参数必须是指定的基类或派生自指定的基类。
      T:<接口名称>   类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。

     1、基类约束

     1 /// <summary>
     2 /// 基类约束:约束T必须是People类型或者是People的子类
     3 /// </summary>
     4 /// <typeparam name="T"></typeparam>
     5 /// <param name="tParameter"></param>
     6 public static void Show<T>(T tParameter) where T : People
     7 {
     8     Console.WriteLine($"{tParameter.Id}_{tParameter.Name}");
     9     Parameter.Hi();
    10 }

    注意:

    基类约束时,基类不能是密封类,即不能是sealed类。sealed类表示该类不能被继承,在这里用作约束就无任何意义,因为sealed类没有子类。

    2、接口约束

    复制代码
    /// <summary>
    /// 接口约束
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t"></param>
    /// <returns></returns>
    public static T Get<T>(T t) where T : ISports
    {
        t.Pingpang();
        return t;
    }
    复制代码

     3、引用类型约束 class

    引用类型约束保证T一定是引用类型的。

    复制代码
     1 /// <summary>
     2 /// 引用类型约束
     3 /// </summary>
     4 /// <typeparam name="T"></typeparam>
     5 /// <param name="t"></param>
     6 /// <returns></returns>
     7 public static T Get<T>(T t) where T : class
     8 {
     9     return t;
    10 }
    复制代码

     4、值类型约束  struct

    值类型约束保证T一定是值类型的。

    复制代码
     1 /// <summary>
     2 /// 值类型类型约束
     3 /// </summary>
     4 /// <typeparam name="T"></typeparam>
     5 /// <param name="t"></param>
     6 /// <returns></returns>
     7 public static T Get<T>(T t) where T : struct
     8 {
     9     return t;
    10 }
    复制代码

     5、无参数构造函数约束  new()

    复制代码
     1 /// <summary>
     2 /// new()约束
     3 /// </summary>
     4 /// <typeparam name="T"></typeparam>
     5 /// <param name="t"></param>
     6 /// <returns></returns>
     7 public static T Get<T>(T t) where T : new()
     8 {
     9     return t;
    10 }
    复制代码

     泛型约束也可以同时约束多个,例如:

    复制代码
    1 public static void Show<T>(T tParameter)
    2             where T : People, ISports, IWork, new()
    3 {
    4     Console.WriteLine($"{tParameter.Id}_{tParameter.Name}");
    5     tParameter.Hi();
    6     tParameter.Pingpang();
    7     tParameter.Work();
    8 }
    复制代码

     注意:有多个泛型约束时,new()约束一定是在最后。

    转载:https://www.cnblogs.com/dotnet261010/p/9034594.html

    转载:https://blog.csdn.net/kebi007/article/details/77800954

  • 相关阅读:
    利用NPOI导出数据到Execl
    分享微信开发Html5轻游戏中的几个坑
    Integrate non-OSGi Dependencies
    Websocket Component
    ServiceMix in daemon mode
    springboot jwt配置(更新中)
    npm run build 后的dist文件,发布到web服务。
    不重复随机数列的生成算法 Leetcode 384. Shuffle an Array
    LSM树-HBASE为什么快
    混沌工程初探
  • 原文地址:https://www.cnblogs.com/chenbingquan/p/10801182.html
Copyright © 2020-2023  润新知