2012-08-11 11 views
5

.NET Reflector kullanılmadığında geri döndüm. .NET framework koduna benzetmek için kullandım. Şimdi uzun bir koşu varsayımsal durumda hayalBir yerleşik .NET toplamasının değiştirilmesi int.MaxValue süreleri ve daha fazlası - potansiyel taşma hatası

public class SomeCollection<T> 
{ 
    internal int version = 0; 

    // code skipped for brevity 

    public void Add(T item) 
    { 
     version++; 

     // add item logic ... 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     return new SomeCollectionEnumerator<T>(this); 
    } 
} 

public class SomeCollectionEnumerator<T> : IEnumerator<T> 
{ 
    private SomeCollection<T> collection; 
    private int version; 

    public SomeCollectionEnumerator(SomeCollection<T> collection) 
    { 
     this.version = collection.version; 
     this.collection = collection; 
    } 

    public bool MoveNext() 
    { 
     if (this.version != this.collection.version) 
     { 
      // collection was modified while iterated over 
      throw SomeException(...); 
     } 
     // iteration logic here... 
    } 
} 

: Bu .NET 2.0 en koleksiyonları döngüler esnasında toplama modifikasyonları tanımak için aşağıdaki mekanizmasını kullanın (Bunun çok güncel sürümleri için geçerlidir inanıyorum) o dikkatimi çekti Uygulama (çalıştığı sürece en az bir süreyi engelleyen ve kararlı ve güvenilir olması gereken bir web hizmeti). Bu, belirli bir toplama örneğini (.NET çerçevesindeki yerleşik koleksiyon türlerinden biri) bellekte çalıştırdığı sürece tutar. Koleksiyon, int.MaxValue değişikliklerinin gerçekleşmesi için yeterince sık değiştiriliyor. Koleksiyonun her bir modifikasyon yöntemindeki version++ satırının taşma istisnası atması riski vardır (taşma kontrolleri global olarak devre dışı bırakıldıysa).

Yansıtılan kodun ayrıntılarına ilişkin zayıf anılarım olduğunu itiraf etmeliyim, ancak version++ işlemlerinin etrafındaki unckecked blok kullanımını hatırlamıyorum. Bu, .NET'teki yerleşik koleksiyon türleri, uzun süredir çalışan uygulama senaryosunun amacı için uygun değil midir? Sadece meraktan biri, bunun gerçekten gerçekleşebileceği gerçek hayat senaryosuyla karşılaştı mı?

+1

dotPeek (http://www.jetbrains.com/decompiler/) durumunda, ücretsiz ve iyi Decompiler yapar çünkü Reflektör hikayesi ağzınızda ekşi bir tat bıraktı. – spender

+1

Ayrıca BCL kaynak kodu (ve diğer birçok MSFT. NET kitaplıkları) http://referencesource.microsoft.com/netframework.aspx –

+1

@spender adresinde paylaşılır ve kullanılabilir, bana göre bu duygu kör olmaktan ziyade Ekşi bir tada sahip olmak, ama sanırım ikimiz de aynı şeyi kastediyoruz. Bugün öğrenmek için başka bir yararlı şey - –

cevap

4

Hayır, C# derleyicisi tamsayı aritmetiği unchecked by default. (Bu derlenmiş BCL içerir.)

+0

Güzel, bunu bilmiyordum. O zaman ben güvenli bir şekilde int.MaxValue' koleksiyon değişiklikleri bir gün yapacak bir uygulama yazmaya girişimi olabilir :) Hızlı cevap için teşekkürler. –

İlgili konular