To dlatego foreach jest przeznaczona do iteracyjnego pojemnik, upewniając się, każdy element jest dokładnie raz odwiedził, bez zmiany pojemnika, aby uniknąć nieprzyjemnych skutki uboczne.
Patrz: foreach in MSDN
Jeśli rozumie dlaczego zmiany elementu jak liczba całkowita nie wpływa pojemnik z liczb całkowitych, a to dlatego, że zmienna iteracji w tym przypadku będzie to typ wartości i jest kopiowany, np:
// Warning: Does not compile
foreach (int i in ints)
{
++i; // Would not change the int in ints
}
Nawet jeśli zmienna iteracji był typem odniesienia, którego operacje powrócił nowy obiekt, nie byłoby zmieniając oryginalną kolekcję, to po prostu być realokacja do tej zmiennej przez większość czasu:
// Warning: Does not compile
foreach (MyClass ob in objs)
{
ob=ob+ob; // Reassigning to local ob, not changing the one from the original
// collection of objs
}
Poniższy przykład ma potencjał, aby właściwie modyfikacji obiektu w oryginalnej kolekcji wywołując mutacjom metody:
// Warning: Does not compile
foreach (MyClass ob in objs)
{
ob.ChangeMe(); // This could modify the object in the original collection
}
Aby uniknąć nieporozumień w odniesieniu do wartości vs typów odniesienia oraz scenariusze wspomniano powyżej (wraz z niektórymi przyczynami związanymi z optymalizacją), firma MS zdecydowała się wprowadzić zmienną iteracji readonly
.
Co masz na myśli jest tylko do odczytu przez pętli while? Pętla while jest konstrukcją; nie jest on ani do odczytu, ani do odczytu i zapisu. Czy możesz po prostu napisać jakiś kod i/lub wyjaśnić swoje pytanie? Dzięki. – CesarGon
Myślę, że on mówi o zmiennej iteracji, jak w foreach (pozycja theItem w theItemList) ... theItem nie można przypisać. –
Teraz wyjaśnił pytanie: mówi o foreach, a nie czasie. – CesarGon