是否有過一個理智戰勝了仿製藥使用Type
參數,即:類型參數與仿製藥
// this...
void Foo(Type T);
// ...over this.
void Foo<T>();
在我看來,泛型是遠遠更有用他們提供的泛型約束,並與C#4.0,反對和共同性,以及可能還有一些我不知道的其他特徵。在我看來,通用形式具有所有優點,並且沒有負面影響,第一種也不會分享。那麼,有沒有什麼情況下你會用第一個呢?
是否有過一個理智戰勝了仿製藥使用Type
參數,即:類型參數與仿製藥
// this...
void Foo(Type T);
// ...over this.
void Foo<T>();
在我看來,泛型是遠遠更有用他們提供的泛型約束,並與C#4.0,反對和共同性,以及可能還有一些我不知道的其他特徵。在我看來,通用形式具有所有優點,並且沒有負面影響,第一種也不會分享。那麼,有沒有什麼情況下你會用第一個呢?
絕對:當你在執行時間之前不知道類型。例如:
foreach (Type t in someAssembly.GetTypes())
{
Foo(t);
}
這樣做,當Foo
是通用是一個痛苦的對接。這是可行的,但痛苦。
它還允許參數爲null
,這在某些情況下可能會有所幫助。
那麼他們真的是不一樣的。
隨着第二個,你實際上有一個類的編譯時間類型(任何人已經通過)。所以你可以調用它的特定功能(比如說它是所有給定的接口)。
在你的第一個例子中,你有一個'Type'類的對象。所以你需要確定它是什麼,然後做一個演員來做任何有用的事情。
沒錯,第二種形式具有所有編譯時檢查的好處。因此,除其他外,我想知道是否有理由使用第一個。我意識到他們是不同的,但不同並不意味着一種形式並不完全包含另一種形式的需要。 – 2009-08-18 23:23:26
那麼我的觀點是,你會用第一個完全不同於第二個目的。你不會將它們用於同一事物(即:調用常用方法或對給定的類類型執行「通用」操作)。 – 2009-08-18 23:27:26
Foo(someVariable.GetType()); // allowed
Foo<someVariable.GetType()>(); // illegal
我相信這是Jon的觀點。 – 2009-08-18 23:29:36
這也是很多更昂貴和緩慢的做仿製藥(所有這些反射調用可以不漂亮) – 2009-08-18 23:21:39
絕對 - 雖然疼痛通常是對我來說更重要的:) – 2009-08-18 23:28:51