2009-08-18 102 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