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

  • ASUS Campus Life

    ASUS Campus

    18 Mart 2013
  • Justin Case

    Justin Case

    3 EKİM 2011
  • WhtButterflyLiz

    WhtButterfly

    14 NİSAN 2008