通用版本与方法的接口版本

时间:2013-01-21 10:45:37

标签: c# generics interface

这两种方法有什么区别?

第一

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);
}

2 个答案:

答案 0 :(得分:13)

对于第一种方法,两个参数的类型必须相同,例如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)
}

答案:第一种方法没有包装第一个参数,而第二种方法没有。

答案 1 :(得分:1)

从提供的代码片段中可以看出差异

泛型版本:

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

Foo<Class1>Foo<Class2>Foo<Class3>

  • 您需要在编译时
  • 定义类型

界面版本:

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

  • 运行时类型定义(更多灵活性),但在纯粹的单词方面不那么“通用”。

一般来说:接口版本更灵活但不太通用(顺便说一下,所有东西自然取决于具体的代码实现)。