77 votes

Foreach () itère-t-il par référence?

Considère ceci:

 List<MyClass> obj_list = get_the_list();
foreach( MyClass obj in obj_list )
{
    obj.property = 42;
}
 

Est-ce que 'obj' est une référence à l'objet correspondant dans la liste, de sorte que lorsque je change la propriété, le changement persiste dans l'instance de l'objet une fois qu'elle a été construite quelque part?

73voto

Brian Rasmussen Points 68853

Oui, obj est une référence à l'objet courant dans la collection (en supposant MyClass est en fait une classe). Si vous modifiez les propriétés par la référence, vous êtes à la modification de l'objet, tout comme vous pouvez attendre.

Sachez cependant que vous ne pouvez pas modifier la variable obj lui-même, que la variable d'itération. Vous obtiendrez une erreur de compilation si vous essayez. Cela signifie que vous ne pouvez pas null et si vous êtes l'itération de la valeur, vous ne pouvez pas modifier tous les membres que ce serait la modification de la valeur.

La spécification du langage C# (états 8.8.4)

"La variable d'itération correspond à lecture seule variable locale avec un champ d'application qui s'étend sur l'embedded instruction".

23voto

jaccso Points 51

Oui, jusqu'à ce que vous changiez le type générique de List en IEnumerable ..

21voto

JaredPar Points 333733

Vous avez posé 2 questions différentes ici, permet de prendre dans l'ordre.

Fait une boucle foreach itérer par référence?

Si tu veux dire dans le même sens en tant que C++ pour la boucle par référence, alors non. C# n'a pas de variable locale références dans le même sens que le C++, et par conséquent ne prend pas en charge ce type d'itération.

Ce changement sera maintenue

En supposant que Maclasse est un type de référence, la réponse est oui. Une classe est un type de référence dans .Net et donc la variable d'itération est une référence à une variable, pas une copie. Ce ne serait pas vrai pour un type de valeur.

17voto

mrzepa Points 200

Eh bien, il m'est arrivé de ne pas mettre à jour mes modifications dans une boucle foreach lorsque j'ai itéré dans la collection var:

 var players = this.GetAllPlayers();
foreach (Player player in players)
{
    player.Position = 1;
}
 

Quand j'ai changé var en List cela a commencé à fonctionner.

4voto

Deepfreezed Points 283

c'est vrai tant que ce n'est pas une structure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X