C# -- 泛型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36445227/article/details/83057998

目录

                                                           泛型种类

                                      泛型中的静态字段和静态方法


Generic ==>  泛型  ==> 泛型类,泛型方法

示例:泛型类

 public class GenericHelper<T> where T : IComparable //类型参数的约束 让T一定有 CompareTo 方法 ==>也就是继承了IComparable接口的类
    {
       
    }

泛型方法 :

public T CompareTo<T>(T target1, T target2) where T : IComparable  //类型参数的约束 让T一定有 CompareTo 方法 使得函数不报错
        {
            if (target1.CompareTo(target2) > 0)
            {
                return target1;
            }

            return target2;
        }

重点 : T 就是 类型参数 

                                                           泛型种类

根据类型参数是否提供实参,将泛型分为 未绑定泛型已构造泛型

未绑定泛型:没有为 类型参数 T 提供实际类型;

已构造泛型: 已经指定了 参数类型 T 的实际类型;

已构造泛型  又可以细分为  开放类型 密封类型

开放类型 : 包含类型参数的泛型

密封类型  :  已经为每一个类型参数都传递了实际数据类型的泛型

示例:判断是密封类型还是开放类型

值得注意的是  ContainsGenericParameters 直白翻译就是 存在泛型参数

                                      泛型中的静态字段和静态方法

在普通类中如MyClass 类中定义了 一个静态字段x,则不管之后创建了多少个该类的实例,也不管从该类派生出多少实例,都只存在一个MyClass.x

但是泛型却稍微有所不同:

结果:

可以看出每个密封的泛型类型都有属于自己的静态变量

这是因为在实际参数替换泛型的类型参数 T 时,编译器会根据不同的类型实参,重新生成类型:

DictionaryStringKey<int>
           DictionaryStringKey<string>
           DictionaryStringKey<DateTime>

,对于编译器来说,每个密封类型泛型都是不同的类型所以它们拥有自己的静态字段,对于静态构造函数也是如此

                                                     类型参数推断

在实例化泛型类时一定要显示的给定 T类型参数  的 实参 ,但是泛型方法可以不指定 类型参数

如下 :

结果:

这被称之为 类型推断 ,和  C#在 局部定义变量 时使用 var 很相似,切记 类型推断 只适用于 泛型方法

                                               泛型参数的约束

在文章最前面展示的类和 方法 都有 where T :IComparable  其中  Where 语句用来使类型参数继承于 IComparable接口

从而使 参数一定继承于 IComparable ,从而对类型参数进行约束。

如下方法 :不加约束就会报错,因为不是所有的类型都有  CompareTo() 方法 

C#中有4种 约束,它们语法类似 :泛型参数约束 要放在 泛型方法 或者 泛型类型 的末尾 并且使用 where 关键字

 1、引用类型约束

 

猜你喜欢

转载自blog.csdn.net/qq_36445227/article/details/83057998