.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ı?
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
Ayrıca BCL kaynak kodu (ve diğer birçok MSFT. NET kitaplıkları) http://referencesource.microsoft.com/netframework.aspx –
@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 - –