SORU
16 ŞUBAT 2012, PERŞEMBE


Neden Listesi<T>.Dosyalarda grup listesi değiştirilmesine izin verir?

Eğer kullanırsam:

var strings = new List<string> { "sample" };
foreach (string s in strings)
{
  Console.WriteLine(s);
  strings.Add(s   "!");
}

foreach Add ayaklarımızın altından halıyı çekmeye olduğumuz için mantıklı bulduğum bir InvalidOperationException (Koleksiyon değiştirildi; numaralama işlemi yürütme yok), atar.

Eğer kullanırsam ancak:

var strings = new List<string> { "sample" };
strings.ForEach(s =>
  {
    Console.WriteLine(s);
    strings.Add(s   "!");
  });

derhal bir OutOfMemoryException atar kadar döngü tarafından ayağından kendisini vuruyor.

Bu hep o Listeyi düşünce olarak benim için bir sürpriz olarak gelir.Dosyalarda grup sadece for foreach veya bir kapsayıcı oldu ya.
Kimse nasıl ve neden bu davranışın bir açıklaması var mı?

(ForEach loop for a Generic List repeated endlessly tarafından İnpired)

CEVAP
16 ŞUBAT 2012, PERŞEMBE


ForEach yöntemi numaralandırıcısı kullanmıyor çünkü, for bir döngü ile: öğeleri döngü

public void ForEach(Action<T> action)
{
    if (action == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
    }
    for (int i = 0; i < this._size; i  )
    {
        action(this._items[i]);
    }
}

(kod JustDecompile ile elde edilen)

Numaralandırıcısı kullanılan olmadığından, bunu asla eğer liste değişip değişmediğini kontrol eder ve for döngünün son durumu _size Her yineleme de artar çünkü hiçbir zaman ulaştı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Disney Pets and Animals

    Disney Pets

    29 ŞUBAT 2012
  • kourtneyannmakeup

    kourtneyannm

    19 ŞUBAT 2012
  • Machinima

    Machinima

    17 Ocak 2006