Jak rozumiem, zmienna iteracyjna C# na foreach jest niezmienna.Dlaczego zmienna Iteracyjna w instrukcji C# foreach jest tylko do odczytu?
Oznacza to, że nie można modyfikować iteracyjnej tak:
foreach (Position Location in Map)
{
//We want to fudge the position to hide the exact coordinates
Location = Location + Random(); //Compiler Error
Plot(Location);
}
nie można zmodyfikować zmienną iteracyjnej bezpośrednio i zamiast tego konieczne użycie pętli
for (int i = 0; i < Map.Count; i++)
{
Position Location = Map[i];
Location = Location + Random();
Plot(Location);
i = Location;
}
Coming z tła C++ widzę foreach jako alternatywę dla pętli for. Ale z powyższym ograniczeniem, zwykle używam pętli for.
Jestem ciekawy, jakie jest uzasadnienie dla niezmienności iteratora?
Edit:
To pytanie jest bardziej pytanie ciekawość, a nie jako problem kodowania. Doceniam odpowiedzi na kodowanie, ale nie mogę ich oznaczyć jako odpowiedzi.
Również powyższy przykład został nadmiernie uproszczony. Oto przykład C++, co chcę zrobić:
// 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;
}
}
nie mogę zrobić wyżej w C# 's foreach ponieważ iterator i jest niezmienna. Myślę (popraw mnie, jeśli się mylę), jest to specyficzne dla projektu foreach w językach.
Jestem zainteresowany tym, dlaczego iterator foreach jest niezmienny.
Dobre znalezisko. Jestem trochę zaskoczony, że nigdy wcześniej tego nie zauważyłem. –
Tak naprawdę nie zmieniasz elementu tablicy w swoim drugim przykładzie. –
@Jakob, naprawdę nie jestem zainteresowany zmianą elementu tablicy. Jestem bardziej zainteresowany tym, dlaczego iterator jest niezmienny. Chyba muszę edytować pytanie, aby to wyjaśnić. – MrValdez