2009-08-18 16 views
6

Czy istnieje kiedykolwiek powód, aby korzystać Type parametry ponad generycznych, czyli:parametrów typu vs. rodzajowych

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

Wydaje mi się, że leki generyczne są o wiele bardziej użyteczne, że zapewniają one rodzajowe ograniczeń i C# 4.0, contravarience i covarience, a także prawdopodobnie kilka innych funkcji, o których nie wiem. Wydaje mi się, że forma generyczna ma wszystkie plusy i nie ma negatywów, z którymi pierwszy również się nie dzieli. Czy są jakieś przypadki, w których zamiast tego używałbyś pierwszego?

Odpowiedz

8

Absolutnie: jeśli nie znasz typu do czasu wykonania. Na przykład:

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

Doing że kiedy Foo jest nazwą rodzajową jest upierdliwe. Jest to wykonalne, ale bolesne.

Umożliwia także ustawienie parametru na null, co może być pomocne w niektórych sytuacjach.

+0

Jest również dużo droższe i wolno robić z rodzajowych (wszystkie te rozmowy odbicie nie może być całkiem) –

+2

Absolutnie - chociaż ból jest zwykle ważniejsze dla mnie :) –

0

Cóż, naprawdę nie są takie same.

Z drugim, masz klasę typu kompilacji (cokolwiek zostało przekazane przez kogokolwiek). Możesz więc wywoływać określone funkcje (powiedz, czy to cały dany interfejs).

W swoim pierwszym przykładzie, masz obiekt klasy "Typ". Musisz więc nadal określić, co to jest i wykonać rzut, aby zrobił z nim coś użytecznego.

+0

Dokładnie, druga forma ma wszystko korzyści z kontroli kompilacji. Tak więc, biorąc pod uwagę to, między innymi, chciałem wiedzieć, czy kiedykolwiek istniał powód, aby użyć pierwszego. Rozumiem, że są różne, ale inne nie oznaczają, że jedna forma nie zaspokaja potrzeby drugiej. –

+0

Chodzi mi o to, że użyjesz pierwszego w zupełnie innym celu niż drugi. Nigdy nie używałbyś ich do tego samego (tj. Wywoływania typowych metod lub wykonywania "ogólnych" działań na danym typie klasy). –

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

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

Wierzę, że to był punkt Jona. –