SORU
3 Kasım 2014, PAZARTESİ


Daha önce bir şey yineleme zaman bu kod 'Koleksiyon değiştirildi atar neden' değil't?

var ints = new List< int >( new[ ] {
    1,
    2,
    3,
    4,
    5
} );
var first = true;
foreach( var v in ints ) {
    if ( first ) {
        for ( long i = 0 ; i < int.MaxValue ;   i ) { //<-- The thing I iterate
            ints.Add( 1 );
            ints.RemoveAt( ints.Count - 1 );
        }
        ints.Add( 6 );
        ints.Add( 7 );
    }
    Console.WriteLine( v );
    first = false;
}

for iç döngü açýklama, atar, belli ki toplama değişiklik yaptık çünkü.

Şimdi eğer sen Yorumsuz, neden bu döngü bize bu iki öğe eklemek için izin? Bir süre yarım dakika gibi çalıştırmak için gereken (Pentium CPU), ama atmak değil, ve komik bir şey verir

Image

Beklenen bir hareketti, ama değiştirebiliriz gösterir ve aslında toplama değiştirir. Bu ortaya çıkan davranışlara neden herhangi bir fikir?

CEVAP
3 Kasım 2014, PAZARTESİ


Sorun List<T> değişiklikleri algılar yolu int, her değişiklik üzerinde artan türü bir sürüm alanı tutulması gereğidir. Eğer yaptıysanız bu yüzdentam olarak2 birden çok32yineleme arasındaki listesi değişiklikler, bu değişikliklerin görünmez algılama ile ilgili olarak yapacaktır. (int.MinValue int.MaxValue taşma ve geri başlangıç değeri olsun eninde sonunda olacak.)

Eğer değiştirmek oldukça çok şey hakkında kod ekleyin 1 veya 3 değerleri yerine 2 veya daha düşük sayıda yineleme senin iç döngü ile 1, sonra atar bir özel durum beklendiği gibi.

(Bu uygulama ayrıntı yerine belirtilen davranış - bir ve çok nadir bir durumda bir hata olarak görülebilir bir uygulama ayrıntı. Bu çok olağandışı gerçek bir programda bir soruna neden görmek, ancak olurdu.)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eddie Bravo

    Eddie Bravo

    17 EKİM 2006
  • Phandroid

    Phandroid

    26 Ocak 2009
  • Willie D.

    Willie D.

    16 Aralık 2006