2009-08-18 107 views
6

是否有過一個理智戰勝了仿製藥使用Type參數,即:類型參數與仿製藥

// this... 
void Foo(Type T); 
// ...over this. 
void Foo<T>(); 

在我看來,泛型是遠遠更有用他們提供的泛型約束,並與C#4.0,反對和共同性,以及可能還有一些我不知道的其他特徵。在我看來,通用形式具有所有優點,並且沒有負面影響,第一種也不會分享。那麼,有沒有什麼情況下你會用第一個呢?

回答

8

絕對:當你在執行時間之前不知道類型。例如:

foreach (Type t in someAssembly.GetTypes()) 
{ 
    Foo(t); 
} 

這樣做,當Foo是通用是一個痛苦的對接。這是可行的,但痛苦。

它還允許參數爲null,這在某些情況下可能會有所幫助。

+0

這也是很多更昂貴和緩慢的做仿製藥(所有這些反射調用可以不漂亮) – 2009-08-18 23:21:39

+2

絕對 - 雖然疼痛通常是對我來說更重要的:) – 2009-08-18 23:28:51

0

那麼他們真的是不一樣的。

隨着第二個,你實際上有一個類的編譯時間類型(任何人已經通過)。所以你可以調用它的特定功能(比如說它是所有給定的接口)。

在你的第一個例子中,你有一個'Type'類的對象。所以你需要確定它是什麼,然後做一個演員來做任何有用的事情。

+0

沒錯,第二種形式具有所有編譯時檢查的好處。因此,除其他外,我想知道是否有理由使用第一個。我意識到他們是不同的,但不同並不意味着一種形式並不完全包含另一種形式的需要。 – 2009-08-18 23:23:26

+0

那麼我的觀點是,你會用第一個完全不同於第二個目的。你不會將它們用於同一事物(即:調用常用方法或對給定的類類型執行「通用」操作)。 – 2009-08-18 23:27:26

1
Foo(someVariable.GetType());  // allowed 

Foo<someVariable.GetType()>(); // illegal 
+0

我相信這是Jon的觀點。 – 2009-08-18 23:29:36