zoukankan      html  css  js  c++  java
  • More Effective C# Item8 :尽可能使用泛型方法,除非需要将类型参数用于实例的字段中

        我们需要来讨论一下泛型类和泛型方法的取舍。

        一般情况下,我们很容易的被泛型类型的定义限制住,但是很多情况下,我们使用泛型方法就可以了。之所以推荐泛型方法,是因为当使用泛型类时,C#编译器必须根据给出的约束为整个泛型类生成合法的IL,而且给出的约束也必须满足整个类的需要;而泛型方法只需要为满足泛型方法的约束就可以了,这样我们可以在同一个类中针对不同的方法设置不同的约束,编译器根据不同的约束来匹配不同的重载形式,同时使用者也会觉得更加清晰。

        来看下面的代码。

    代码
    1 public static class UtilWithGenerics<T>
    2 {
    3 public static T Max(T left, T right)
    4 {
    5 return Comparer<T>.Default.Compare(left, right) < 0 ? right : left;
    6 }
    7 }
    8
    9  public static class UtilWithoutGenerics
    10 {
    11 public static T Max<T>(T left, T right)
    12 {
    13 return Comparer<T>.Default.Compare(left, right) < 0 ? right : left;
    14 }
    15
    16 public static int Max(int left, int right)
    17 {
    18 return Math.Max(left, right);
    19 }
    20
    21 public static double Max(double left, double right)
    22 {
    23 return Math.Max(left, right);
    24 }
    25 }
        上面代码针对如何取得最大值,提供了两种方案,一种是使用泛型类的方式,一种是使用泛型方法的方式。

        下面的代码是针对上述代码的测试程序。

    代码
    1 private static void Test()
    2 {
    3 Console.WriteLine(UtilWithGenerics<int>.Max(1, 2));
    4 Console.WriteLine(UtilWithGenerics<string>.Max("A", "B"));
    5 Console.WriteLine(UtilWithoutGenerics.Max(1, 2));
    6 Console.WriteLine(UtilWithoutGenerics.Max("A", "B"));
    7 }
        执行结果很简单,在此不再赘述。

        我们来看上述代码, 请注意以下语句:

    1 Console.WriteLine(UtilWithGenerics<string>.Max("A", "B"));
    2 Console.WriteLine(UtilWithoutGenerics.Max<string>("A", "B"));
    3 Console.WriteLine(UtilWithoutGenerics.Max("A", "B"));
        上述三条语句的执行结果都是一样的,即将“B”输出到控制台中。

        但是从上面语句中,我们可以看到以下两个问题:1)如果用户使用第一句或者第二句的话,还需要执行泛型类型,是比较麻烦的,相反,第三句没有对类型进行任何指定,而是由编辑器进行确定,从易用性来说,更好一些,而这种优点,只能用于泛型方法,无法用于泛型类;2)由于泛型方法可以由编译器来决定运行时采用的重载形式,那么泛型方法可以带来更好的可扩展性,例如,我们可以在UtilWithourGenerics类中追加一个静态方法:Max(string left, string right),这样,程序在执行时,上述第三句代码就会调用非泛型版本的重载形式,而不会调用泛型版本的重载形式,这种修改方式,只是在UtilWithoutGenerics类中进行,调用方式不需要进行任何改动的。这对于项目后期维护来说,是非常重要的。

        虽然泛型方法有很多好处,但是在某些情况下,我们还是需要使用泛型类的,例如:1)类本身需要存放类型参数对象作为其内部状态(例如集合类型);2)类实现了泛型接口,这是类本身也必须是泛型类。

        综上,使用泛型方法,和泛型类相比,有以下两点优势:1)简化了调用过程;2)提高了程序的可扩展性和可维护性。

        
    作者:李潘
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Vector用法。
    error LNK2001的解决方法
    指针(详解)
    xxx cannot be resolved to a type
    springmvc写了方法无法访问
    java lombok包在maven已经配置,但是注解没用
    系统提供的相关intent
    Activity小结
    BrocastReceiver入门
    AppWidget入门
  • 原文地址:https://www.cnblogs.com/wing011203/p/1758424.html
Copyright © 2011-2022 走看看