C# Academy · Lekcja

Typowe błędy podczas iterowania

Modyfikowanie kolekcji podczas iteracji.

Lekcja 4 z 413 kroki

Typowe błędy podczas iterowania to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Pułapki związane z iteracją

Pętle są proste, ale kilka błędów wciąż sprawia początkującym wiele problemów.

W tej lekcji omówimy najczęstsze błędy związane z iteracją oraz sposoby ich unikania.

Modyfikowanie podczas iteracji

Najpoważniejszym błędem jest zmienianie kolekcji podczas iterowania po niej za pomocą foreach.

Dodawanie lub usuwanie elementów w trakcie iteracji powoduje zgłoszenie wyjątku InvalidOperationException w czasie działania programu.

foreach (var n in list)
{
    if (n < 0) list.Remove(n); // ERROR at runtime
}

Bezpieczne rozwiązanie

Aby usuwać elementy w trakcie pętli, należy iterować po kopii albo najpierw zebrać elementy, a następnie usunąć je po zakończeniu iteracji.

Iterowanie po list.ToList() zapewnia oddzielną migawkę, po której można się poruszać.

var list = new List<int> { 1, -2, 3, -4 };
foreach (var n in list.ToList())
{
    if (n < 0) list.Remove(n);
}
Console.WriteLine(string.Join(",", list));

Błąd przesunięcia o jeden w pętlach for

W ręcznie tworzonej pętli for użycie <= zamiast < powoduje odczyt poza końcem kolekcji.

Prawidłowe indeksy obejmują zakres od 0 do Length - 1, dlatego warunek powinien mieć postać i < Length.

for (int i = 0; i <= arr.Length; i++) // BUG: <= goes too far
{
    Console.WriteLine(arr[i]);
}

IndexOutOfRange

Ten błąd przesunięcia o jeden powoduje wyjątek IndexOutOfRangeException.

foreach całkowicie zapobiega temu problemowi, ponieważ nigdy nie używa indeksu. Należy preferować tę pętlę, gdy trzeba tylko odczytywać elementy.

string[] arr = { "a", "b", "c" };
for (int i = 0; i < arr.Length; i++) // correct: < Length
{
    Console.WriteLine(arr[i]);
}

Oczekiwanie, że foreach zmieni elementy

Przypisanie wartości zmiennej pętli nie zmienia kolekcji, a w przypadku typów wartości i tak jest to kopia.

Aby aktualizować elementy, należy użyć pętli for z indeksowaniem.

int[] nums = { 1, 2, 3 };
for (int i = 0; i < nums.Length; i++)
{
    nums[i] = nums[i] * 10;
}
Console.WriteLine(string.Join(",", nums));

Kolekcja null

Wywołanie foreach dla odwołania null powoduje zgłoszenie wyjątku NullReferenceException.

Pusta kolekcja jest prawidłowa, ale null nie. Przed rozpoczęciem pętli należy sprawdzić odwołanie lub je zainicjalizować.

List<int> data = null;
if (data != null)
{
    foreach (var x in data) Console.WriteLine(x);
}

Nieporozumienia dotyczące zakresu zmiennych

Zmienna pętli istnieje tylko wewnątrz treści pętli.

Próba użycia jej po zakończeniu pętli powoduje błąd kompilacji, ponieważ po wyjściu z pętli znajduje się poza zakresem.

foreach (var n in nums)
{
    Console.WriteLine(n);
}
// Console.WriteLine(n); // ERROR: n not in scope here

Zapominanie o nawiasach klamrowych

Bez nawiasów klamrowych do pętli należy tylko następna pojedyncza instrukcja.

Może to po cichu zmienić działanie logiki. W przypadku treści obejmującej wiele wierszy należy zawsze używać nawiasów klamrowych, aby zachować jasny zamiar kodu.

foreach (var n in nums)
    Console.WriteLine(n);
    Console.WriteLine("runs once, not per item");

Ryzyko nieskończonej pętli while

W przeciwieństwie do foreach pętla while może działać bez końca, jeśli jej warunek nigdy nie stanie się fałszywy.

Należy zawsze upewnić się, że coś wewnątrz pętli przybliża wykonanie do warunku wyjścia.

int i = 0;
while (i < 3)
{
    Console.WriteLine(i);
    i++; // forgetting this would loop forever
}

Wybór właściwej pętli

Odczyt każdego elementu, bez potrzeby użycia indeksu → foreach.

Potrzebny indeks lub konieczność modyfikowania elementów w miejscu → for. Powtarzanie do momentu zmiany warunku → while.

Szybkie sprawdzenie

Proszę sprawdzić, czego nauczyli się Państwo o błędach związanych z iteracją.

Podsumowanie

Poznali Państwo sposoby unikania modyfikowania kolekcji podczas używania foreach, błędów przesunięcia o jeden z użyciem <=, problemów z pustymi odwołaniami do kolekcji oraz nieporozumień dotyczących zakresu.

Należy wybierać foreach do odczytu, for do modyfikowania elementów za pomocą indeksu, a while do pętli zależnych od warunku z jasno określonym wyjściem.

Bezpłatny start

Ucz się C# dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
93
Lekcje
346

Często zadawane pytania

Czy lekcja „Typowe błędy podczas iterowania” jest bezpłatna?

Tak — pełny tekst „Typowe błędy podczas iterowania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Typowe błędy podczas iterowania”?

Modyfikowanie kolekcji podczas iteracji. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Typowe błędy podczas iterowania”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Pętla foreach
  2. Iterowanie po kolekcjach
  3. break i continue
  4. Typowe błędy podczas iterowania
← Powrót do C# Academy