9
votes

Mettre à jour la structure dans la boucle de Foreach en C #

J'ai ce code (C #): XXX

Il ne compilera pas.
L'erreur est la suivante: xxx

si je change chose à un class plutôt qu'un struct , cependant, cela compile.

S'il vous plaît quelqu'un peut-il expliquer ce qui se passe?


1 commentaires

4 Réponses :


8
votes

une structure n'est pas un type de référence mais un type de valeur.

Si vous auriez une classe au lieu d'un struct pour chose , la boucle de foresach créerait une variable de référence pour vous, qui serait Pointez sur le bon élément de votre liste. Mais puisqu'il s'agit d'un type de valeur, il ne fonctionne que sur une copie de votre , qui est dans ce cas la variable d'itération.


2 commentaires

Oui, c'est pertinent. Comme il s'agit d'un type de valeur, toute la structure est la variable de boucle et, par conséquent, aucune partie ne peut être modifiée.


Merci d'avoir expliqué la différence, Johannes. Très appréciée. +1



12
votes

Plus ou moins de ce qu'il dit, le compilateur ne vous permettra pas de changer (parties de) la boucle Var dans un forach.

Utilisez simplement: xxx

et cela fonctionne lorsque chose est une classe car votre boucle variait est une référence et vous ne modifiez que des modifications. à l'objet référencé, non à la référence elle-même.


0 commentaires

2
votes

Une structure est un type de valeur mais une classe est un type de référence. C'est pourquoi il compile quand il s'agit d'une classe mais pas quand c'est une structure

Voir plus: http://www.albahaari.com/valuevsreftypes.aspx < / p>


0 commentaires

3
votes

Une syntaxe alternative que je préfère à la solution de @ Henk est ceci.

DateTime[] dates = new DateTime[10];

foreach(int index in Enumerable.Range(0, dates.Length))
{
   ref DateTime date = ref dates[index];

   // Do stuff with date.
   // ...
}


0 commentaires