2010-10-30 83 views
3

我一直在研究一些不同庫的代碼,並注意到有些將在同一個類中提供等價的泛型和非泛型函數。爲什麼使用泛型和非泛型函數變體?

一個例子是Common Service Locator項目的IServiceLocator接口:

public interface IServiceLocator 
{ 
    object GetInstance(Type serviceType); 
    object GetInstance(Type serviceType, string key); 
    IEnumerable<object> GetAllInstances(Type serviceType); 

    TService GetInstance<TService>(); 
    TService GetInstance<TService>(string key); 
    IEnumerable<TService> GetAllInstances<TService>(); 

} 

我得到的印象是,這是從COM最大化交通方便,也許。沒有這些擔憂,這似乎是冗餘代碼。有什麼我失蹤?

回答

2

大概是因爲泛型類型是語法好,用戶會喜歡它,因爲它可以將其轉換爲正確的類型,但是,例如,如果該類型在運行時使用反射擡起頭來,你不能使用通用選項,並需要使用一個類型。

此外,泛型總是在編譯時解決。當你知道編譯時的類型時,可以把它看作使用通用的類型,而在運行時則是非泛型的。

6

有時候,你知道你需要在編譯時的類型,此時仿製藥可以給你編譯時的安全和整潔的代碼。

有時你只知道你需要在執行時的類型,此時仿製藥成爲頸部疼痛,因爲你需要通過反射給他們打電話。

提供這兩個選項可以靈活地處理這兩種情況。

0

的原因是,非通用將利用檢查其類型隱含泛型,這樣你就不必提類型。

相關問題