Ce que je comprends, C#foreach variable d'itération est immuable.
Ce qui signifie que je ne peux pas modifier l'itérateur comme ceci:
foreach (Position Location in Map)
{
//We want to fudge the position to hide the exact coordinates
Location = Location + Random(); //Compiler Error
Plot(Location);
}
Je ne peux pas modifier la variable d'itérateur directement et au lieu de cela, je dois utiliser une boucle for
for (int i = 0; i < Map.Count; i++)
{
Position Location = Map[i];
Location = Location + Random();
Plot(Location);
i = Location;
}
Venant d'un C++ fond, je vois foreach comme une alternative à la boucle for. Mais avec la restriction ci-dessus, j'ai l'habitude de secours à l'aide de la boucle for.
Je suis curieux, quel est l'intérêt de faire de l'itérateur immuable?
Edit:
Cette question est plus de la curiosité et non comme une question de codage. J'ai apprécié le codage des réponses, mais je ne peux pas les marquer comme réponses.
Aussi, l'exemple ci-dessus a été simplifiée. Voici un exemple C++ de ce que je veux faire:
// The game's rules:
// - The "Laser Of Death (tm)" moves around the game board from the
// start area (index 0) until the end area (index BoardSize)
// - If the Laser hits a teleporter, destroy that teleporter on the
// board and move the Laser to the square where the teleporter
// points to
// - If the Laser hits a player, deal 15 damage and stop the laser.
for (int i = 0; i < BoardSize; i++)
{
if (GetItem(Board[i]) == Teleporter)
{
TeleportSquare = GetTeleportSquare(Board[i]);
SetItem(Board[i], FreeSpace);
i = TeleportSquare;
}
if (GetItem(Board[i]) == Player)
{
Player.Life -= 15;
break;
}
}
Je ne peux pas faire ci-dessus en C#foreach parce que l'itérateur i est immuable. Je pense (corrigez-moi si je me trompe), c'est spécifique à la conception de foreach dans les langues.
Je suis intéressé par pourquoi le foreach itérateur est immuable.