ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ вопросов ❓ Π½Π° собСсСдовании Π² C# 🍧

ΠžΠ±Π·ΠΎΡ€ вопросов ΠΏΠΎ языка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ C# ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ NET


Project maintained by Dvurechensky-Docs Hosted on GitHub Pages — Theme by mattgraham

πŸ” Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ†ΠΈΠΊΠ» `for` ΠΈ Ρ‡Π΅ΠΌ ΠΎΠ½ отличаСтся ΠΎΡ‚ `foreach`?

Typing SVG

Static Badge

✨ ОглавлСниС

⬆ Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ


1️⃣ Бинтаксис ΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅

Π¦ΠΈΠΊΠ» for

for (int i = 0; i < collection.Length; i++)
{
    Console.WriteLine(collection[i]);
}

Π¦ΠΈΠΊΠ» foreach

foreach (var item in collection)
{
    Console.WriteLine(item);
}

2️⃣ Под ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ

for (массивы ΠΈ List<T>)

foreach (IEnumerable/IEnumerator)

var enumerator = collection.GetEnumerator();
try
{
    while (enumerator.MoveNext())
    {
        var item = enumerator.Current;
        Console.WriteLine(item);
    }
}
finally
{
    enumerator.Dispose();
}

3️⃣ ΠžΡ‚Π»ΠΈΡ‡ΠΈΡ for ΠΈ foreach

Π₯арактСристика for foreach
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° индСкса Π”Π° НСт (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· Current)
ИзмСнСниС ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π²ΠΎ врСмя ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ МоТно (ΠΏΡ€ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠ΅) НСльзя (InvalidOperationException)
ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Быстро, особСнно для массивов НСмного ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΠΏΡ€ΠΈ IEnumerable, Π½ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ для массивов ΠΈ List
Π§ΠΈΡ‚Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° МСнСС Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΈ слоТных условиях Π‘ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ, мСньшС ошибок
Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ элСмСнты/шаг Π”Π° (i+=2) НСт (Π½ΡƒΠΆΠ΅Π½ LINQ ΠΈΠ»ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ°)
ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ направлСния Π”Π° (Π²ΠΏΠ΅Ρ€Π΅Π΄, Π½Π°Π·Π°Π΄) НСт, всСгда ΠΏΠΎ порядку
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ enumerator НСт Π”Π° (GetEnumerator)
Аллокации ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ (для struct enumerator ΠΏΡ€ΠΈ boxing)

4️⃣ ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ коллСкциями

ΠœΠ°ΡΡΠΈΠ²Ρ‹ (T[])

List<T>

LinkedList<T>


5️⃣ ΠŸΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ

  1. ИзмСнСниС ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ

    • for позволяСт ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ элСмСнты ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π΅.
    • foreach β€” выброс ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ссли коллСкция измСняСтся.
  2. Boxing enumerator’ов

    • Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ foreach, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ боксирована, Ссли коллСкция приводится ΠΊ IEnumerable/IEnumerable<T>.
  3. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнтов

// ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ с for
for (int i = list.Count - 1; i >= 0; i--)
{
    if (ShouldRemove(list[i])) list.RemoveAt(i);
}

// foreach выбросит InvalidOperationException
  1. ΠŸΡ€ΠΎΠΏΡƒΡΠΊ шагов
for (int i = 0; i < 10; i+=2) { ... } // Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ΄ΠΈΠ½
// foreach Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ шаг Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ
  1. ΠŸΠ΅Ρ€Ρ„ΠΎΡ€ΠΌΠ°Π½Ρ

6️⃣ Когда Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ


7️⃣ Вопросы Π½Π° собСсС

  1. Π§Π΅ΠΌ for отличаСтся ΠΎΡ‚ foreach? for β€” управляСт индСксом Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, foreach β€” Ρ‡Π΅Ρ€Π΅Π· enumerator.

  2. МоТно Π»ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ элСмСнты Π² foreach? НСт, выброс InvalidOperationException.

  3. ΠŸΠΎΡ‡Π΅ΠΌΡƒ foreach ΠΈΠ½ΠΎΠ³Π΄Π° Π°Π»Π»ΠΎΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ? Если enumerator β€” struct, Π½ΠΎ коллСкция ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΊ интСрфСйсу IEnumerable.

  4. Π§Ρ‚ΠΎ быстрСС β€” for ΠΈΠ»ΠΈ foreach для массивов? ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ, ΠΈΠ½ΠΎΠ³Π΄Π° for Ρ‡ΡƒΡ‚ΡŒ быстрСС (Π½Π΅Ρ‚ enumerator’а).

  5. Как ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ List<T> Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС бСзопасно?

for (int i = list.Count - 1; i >= 0; i--) { ... }

⬆ Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΉ

✨Dvurechensky✨