7
votes

C # Référence à la variable de boucle

est-il possible en C # à quelque chose comme le suivant

foreach (ref string var in arr) {
    var = "new value";
}


0 commentaires

5 Réponses :


22
votes

Il n'y a pas de telles constructions pour Mise à jour une boucle; Un itérateur est en lecture seule. Par exemple, ce qui suit fournit un itérateur parfaitement valide: xxx

Comment serait-il à jour? ce que mettrait à jour?

Si les données sont une matrice / liste / etc., alors quelque chose comme: xxx

ou autres options en fonction du conteneur spécifique.


mise à jour; À une poussée , une méthode d'extension: xxx


1 commentaires

Vous pouvez même vouloir mettre la liste de retour ; à la fin de votre méthode d'extension UpdateAll de sorte qu'elle puisse être chaînée et / ou renvoyée s'il est utilisé directement dans une mission telle que List Mots = Quelquewewards.UpdateAll (S => s.trim ()); .



2
votes

Non. La relève foreach est simplement Syntaxe Sugar sur le dessus du iEnumerable interface. Cette interface définit une méthode pour obtenir en Ieumerator qui à son tour a des méthodes pour faire lecture seule énumération:

  • Courant: Objet
  • MOVENEXT (): BOOL
  • Réinitialisation (): Void

2 commentaires

strictement parle, il n'a même pas besoin d'iEnumerable / ienumerator, et il n'utilise jamais RESET () - mais en effet (+1)


Et si vous utilisez un tableau, cela n'utilise pas du tout iEnumerable.



0
votes

Dans le cas d'une chaîne, non; Les chaînes C # sont immuables (ne peuvent pas être changées). Si vous énumérez des objets d'un type différent et mutable, vous pouvez modifier les propriétés de ces objets.


0 commentaires

2
votes
for(int i = 0; i < strings.Count; ++i)
{
  string s = strings[i];
  //do work
  s = s.ToUpperInvariant();
  strings[i] = s;
}

2 commentaires

En fait, la "chaîne s" est à l'extérieur la boucle; Cela est important de comprendre le problème infâmé de pourachis / de capture. Et il utilisera Dispose () si Idisposable est implémentée


Était plus pour la démonstration que la précision, mais vous avez raison, @MARC Gravell. J'ai déplacé la chaîne extérieure sur la boucle. En laissant disposer () comme un exercice au lecteur comme orthoganol à cette discussion.



1
votes

Dans le cas d'une chaîne, non; C # Les chaînes sont immuables (ne peuvent pas être modifié). Si vous énumérez-vous sur objets d'un type différent et mutable, Vous pouvez changer les propriétés de ces objets.

juste pour illustrer ce que Jacob parle de. Considérez l'extrait de code ci-dessous: xxx

en effet, si vous essayez d'attribuer à "obj" comme ci-dessus, vous obtiendrez une erreur de temps de compilation. Mais rien ne vous empêche de modifier les propriétés de Myint à travers la référence "obj"


0 commentaires