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
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ı.
.NET - Listesi<T> a 'dosyal...
C# MVC3 Razor öğeleri alternatif @dosy...
Neden Listesi< devralır;T>?...
Neden orada IEnumerable hiçbir dosyala...
Neden ICollection ve IEnumerable veya ...