2013-01-21 45 views
6

這兩種方法有什麼區別?通用版本vs接口版本的方法

第一:

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

它不是那個帖子的完全重複,因爲這裏我們有兩個參數,它改變了一些標準。看看第一個答案,看看有什麼不同 –

回答

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

從提供可以說差的代碼片段,其

泛型版本:

  • 泛型新的代碼將用於定義

Foo<Class1>Foo<Class2>每一種類型產生, Foo<Class3>

  • 你需要定義一個類型,編譯時間

接口版本:從OOP概念

  • 利益,從實際的代碼隱藏實現細節。

  • 運行時類型定義(更多的靈活性),但是對於那個單詞的純粹意義來說,它不那麼「通用」。

一般:接口版本更靈活但不通用的(一切,順便說一下,當然取決於具體的代碼implementaiton)。