2015-10-12 82 views
1

這個問題泛型方法是特別爲約通用方法(未類)。與約束與非通用方法

是什麼下面的兩個語句之間的區別?

public bool MyMethod<T>(T t) where T : IMyInterface {} 

public bool MyMethod(IMyInterface t) { } 

第一語句定義了一個通用的方法和約束的類型,第二個是一個非通用的方法和指定參數的類型。爲什麼你會用另一個呢?

或者類似的例子:

public class LibraryItem 
{ 
    public string Title; 
    public int Stock; 
} 

public void CheckIn<T>(T item) where T : LibraryItem 
{ 
    item.Stock += 1; 
} 

public void CheckIn2(LibraryItem item) 
{ 
    item.Stock += 1; 
} 

再次,這將是使用通用版在非通用版本的優勢在哪裏?

+0

在你的情況下,幾乎沒有。 – SLaks

+0

您是否也會好奇公共T GetItem (int id)的優勢?其中T:IMyInterface {}?或者您是否理解這一點? – mason

+0

@mason我得到那個,如果一個泛型值被返回,它就更有意義。 –

回答

3

這種簡單的約束條件沒有太大的區別。

在第一個示例中,如果Tstruct,則非泛型方法將導致裝箱。通用方法不需要裝箱。

約束不侷限於單一的接口,所以有時你無法實現與非泛型方法相同的功能。

0

輸出編譯成可執行文件可能是不同的,但我不能看到從編程的角度來看的2個版本有什麼區別:在這兩種情況下,你必須通過一個IMyInterface的對象調用的函數。

除...通用似乎沒有真正的利益而過於複雜。

你知道你必須處理一些特定的接口類型作爲參數,無需對仿製藥。

考慮在框架類List<T>的對面,這是一個只能處理T對象的列表:在這種情況下,泛型出現了,並且使用接口不會。