8
votes

Type Paramètres vs. Generics

Y a-t-il déjà une raison d'utiliser des paramètres de type sur les génériques, c'est-à-dire: xxx

Il me semble que les génériques sont beaucoup plus utiles en ce qu'ils fournissent génériques Contraintes et avec C # 4.0, contre la contre-covérité et la covariance, ainsi que probablement d'autres caractéristiques que je ne connais pas. Il me semblerait que la forme générique a tous les plus et aucun négatif que le premier ne partage pas également. Alors, y a-t-il des cas où vous utiliseriez le premier à la place?


0 commentaires

3 Réponses :


10
votes

Absolument: Lorsque vous ne connaissez pas le type avant l'exécution. Par exemple: xxx

faisant cela lorsque foo est générique est douloureux. C'est faisable mais douloureux.

Il permet également au paramètre d'être null , qui peut être utile dans certaines situations.


2 commentaires

Il est aussi beaucoup plus cher et lent à faire avec des génériques (tous ces appels de réflexion ne peuvent pas être jolis)


Absolument - bien que la douleur soit normalement plus importante pour moi :)



0
votes

Eh bien, ils ne sont vraiment pas les mêmes du tout.

Avec le second, vous avez en fait une classe de type de compilation (tout ce qui a été transmis par quiconque). Donc, vous pouvez appeler des fonctions spécifiques à ce sujet (par exemple si tout est une interface donnée).

Dans votre premier exemple, vous avez un objet de type "type". Donc, vous devrez toujours déterminer ce que c'est et faire un casting pour faire quoi que ce soit utile.


2 commentaires

Exactement, la deuxième forme a tous les avantages de la vérification du temps de compilation. Donc, étant donné que, entre autres choses, je voulais savoir s'il y avait toujours une raison d'utiliser le premier. Je me rends compte qu'ils sont différents, mais différents ne veulent pas dire qu'un formulaire ne subsume pas complètement le besoin de l'autre.


Eh bien, mon point est que vous utiliserez le premier pour un but totalement différent de celui de la seconde. Vous ne les utiliseriez jamais pour la même chose (c'est-à-dire appeler des méthodes communes ou effectuer des actions «génériques» sur un type de classe donné).



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

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

0 commentaires