【问题标题】:Generic version vs interface version of a method方法的通用版本与接口版本
【发布时间】:2013-01-21 10:45:37
【问题描述】:

这两种方法有什么区别?

第一:

public static int Foo<T>(T first, T second) where T:IComparable
{
    return first.CompareTo(second)
}

秒:

public static int Foo(IComparable first, IComparable second)
{
    return first.CompareTo(second);
}

【问题讨论】:

  • 它与该帖子并不完全相同,因为这里我们有两个参数并且它改变了一些标准。看看第一个答案,看看有什么区别

标签: c# generics interface


【解决方案1】:

对于第一种方法,两个参数的类型必须相同,例如intint。该类型必须实现IComparable 接口。

对于第二种方法,两个参数可以有不同的类型。两种类型都必须实现IComparable 接口,但不必相同,例如intstring

请注意,如果类型不同,IComparable.CompareTo method 可能会抛出异常。所以最好确保类型 实际上是相同的。您可以使用第一种方法来做到这一点,或者使用通用的IComparable<T> interface 更好。


接下来的问题当然是:这两种方法有什么区别?

第一:

public static int Foo<T1, T2>(T1 first, T2 second) where T1 : IComparable<T2>
{
    return first.CompareTo(second);
}

秒:

public static int Foo<T>(IComparable<T> first, T second)
{
    return first.CompareTo(second)
}

答案:第一种方法不对第一个参数进行装箱,而第二种方法可以。

【讨论】:

    【解决方案2】:

    从提供的代码片段可以说,区别在于

    泛型版本:

    • 对于泛型,将为定义的每个类型生成新代码

    Foo&lt;Class1&gt;Foo&lt;Class2&gt;Foo&lt;Class3&gt;

    • 你需要在编译时定义一个类型

    接口版本:

    • 受益于 OOP 概念,将实现细节隐藏在实际代码中。

    • 运行时类型定义(更灵活),但就该词的纯粹含义而言,“通用”较少。

    一般来说:接口版本更灵活但不那么通用(顺便说一句,一切自然取决于具体的代码实现)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2013-09-29
      • 1970-01-01
      • 2016-02-01
      相关资源
      最近更新 更多