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

Это также много более дорогое и медленное делать с обобщениями (все эти отражения вызовов не могут быть довольно) –

+2

Абсолютно - хотя боль обычно более важна для меня :) –

0

Ну, они действительно не то же самое.

Во-вторых, у вас действительно есть класс типа времени компиляции (независимо от того, кто был передан кем бы то ни было). Таким образом, вы можете вызывать определенные функции на нем (скажем, если это весь определенный интерфейс).

В первом примере у вас есть объект класса «Тип». Поэтому вам нужно будет все же определить, что это такое, и сделать актерский сбор, чтобы сделать что-нибудь полезное с ним.

+0

Ровно, второй формы имеет все преимущества проверки времени компиляции. Поэтому, учитывая, что, помимо всего прочего, я хотел знать, есть ли когда-либо причина использовать первое. Я понимаю, что они разные, но разные не означает, что одна форма не полностью предполагает потребность в другом. –

+0

Ну, моя точка зрения, вы будете использовать первый для совершенно другой цели, чем второй. Вы никогда не будете использовать их для одного и того же (например: вызов общих методов или выполнение «общих» действий для данного типа класса). –

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

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

Я считаю, что это был вопрос Джона. –

Смежные вопросы