10
votes

Comment les génériques C # affectent-ils les collections avec des primitives?

Si je comprends bien, c # /. Les génériques nets appuient un certain degré de réification. Donc, si j'ai le code suivant:

List<int> list = new List<int>();
list.Add(1);


0 commentaires

4 Réponses :


3
votes

.NET Les génériques sont spécialisés pour les structures, il n'y a donc pas de boxe requise dans votre cas. Notez qu'il n'y a pas besoin de casting aussi de toute façon.


0 commentaires

20
votes

Non, ce ne sera pas en boîte. Au moment de l'exécution, la matrice de support pour la liste code> sera réellement un int [] code>. Notez que ce n'est que le cas avec des types primitifs authentiques - Liste code> ne pas enregistrer pas les valeurs de tout type de valeur em> (en supposant qu'il a été déclaré comme LISTE CODE> ETC plutôt que LISTE CODE>) Génériques et traite avec eux de manière appropriée, plutôt que dans Java où la JVM est très ignorante d'eux. p>

Par exemple, si vous écrivez: p>

object list = new List<string>();
Type type = list.GetType();


0 commentaires

5
votes

Les valeurs int ne seront pas en boîte dans la liste. C'est l'une des beautés des génériques, que le compilateur (plus spécifiquement le compilateur JIT, je pense) construira une version typée de la liste <> classe, plutôt que de stocker les valeurs comme objet . Il fait donc non seulement appliquer la sécurité de type à travers les méthodes et les propriétés exposées, mais elle est véritablement typée dans tous les aspects.


0 commentaires

5
votes

Comme d'autres l'ont noté, la gestère génère un nouveau code pour chaque construction impliquant un nouveau type de valeur. Un point intéressant non encore mentionné jusqu'à présent est que la gestère générera du code une fois pour une construction de type de référence et réutiliser que pour tous les types de référence . Le code de list est exactement identique à celui du code de la liste .

Cela pourrait sembler fou, mais rappelez-vous que les génériques ne sont pas des modèles. Au moment où le code de l'organisme de méthode générique IL est émis, une résolution de surcharge et une autre analyse sémantique pertinente est déjà fait par le compilateur C #.


1 commentaires

Cependant, un appel à, dire, nouveau t [10] créera toujours le bon type de matrice, même pour les types de référence.