2012-08-11 4 views
5

समय पर वापस जब .NET परावर्तक मुक्त था, तो मैंने इसे .NET फ्रेमवर्क कोड में गैस करने के लिए उपयोग किया। यह मेरा ध्यान गया .NET 2.0 में सबसे अधिक संग्रह (मेरा मानना ​​है कि यह भी वर्तमान संस्करण के लिए लागू है) जो निम्न तंत्र का उपयोग छोरों के दौरान संग्रह संशोधनों पहचान करने के लिए:अंतर्निहित .NET संग्रह int.MaxValue समय और अधिक संशोधित करना - संभावित अतिप्रवाह त्रुटि

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... 
    } 
} 

अब एक लंबी चलने की काल्पनिक मामले की कल्पना आवेदन (एक भारी उपयोग की जाने वाली वेब सेवा जिसमें न्यूनतम डाउनटाइम होना चाहिए और स्थिर और भरोसेमंद होना चाहिए) जो कि जब तक यह चलता है तब तक स्मृति में एक संग्रहित संग्रह (.NET Framework में अंतर्निहित संग्रह प्रकारों में से एक) रखता है। संग्रह अक्सर पर्याप्त रूप से संशोधित हो जाता है ताकि int.MaxValue संशोधन होने के लिए संभव हो। क्या कोई जोखिम है कि संग्रह की प्रत्येक संशोधन विधि में version++ लाइन ओवरफ्लो अपवाद फेंकता है (माना जाता है कि अतिप्रवाह चेक वैश्विक रूप से अक्षम नहीं हैं)।

मुझे यह स्वीकार करना होगा कि मुझे प्रतिबिंबित कोड के विवरण की कमजोर यादें हैं, लेकिन मुझे ब्लॉक version++ संचालन के उपयोग को याद नहीं है। क्या इसका मतलब है कि .NET में अंतर्निहित संग्रह प्रकार ऐसे लंबे समय तक चल रहे एप्लिकेशन परिदृश्य के उद्देश्य के लिए उपयुक्त नहीं हैं? जिज्ञासा से बाहर, क्या किसी को वास्तविक जीवन परिदृश्य का सामना करना पड़ा है जहां यह वास्तव में हो सकता है?

+1

dotPeek (http://www.jetbrains.com/decompiler/) एक स्वतंत्र और अच्छा decompiler है, मामले में परावर्तक कहानी ने आपके मुंह में खट्टा स्वाद छोड़ा। – spender

+1

इसके अलावा बीसीएल स्रोत कोड (और अधिकांश अन्य एमएसएफटी .NET पुस्तकालय) साझा और उपलब्ध हैं http://referencesource.microsoft.com/netframework.aspx –

+1

@ स्पेंडर धन्यवाद, मुझे लगता है कि भावना अंधे होने की तरह अधिक है खट्टा स्वाद है, लेकिन मुझे लगता है कि हम दोनों एक ही बात का मतलब है। आज सीखने के लिए एक और उपयोगी बात - जेटब्रेन –

उत्तर

4

नहीं, क्योंकि सी # संकलक बनाता पूर्णांक गणित unchecked by default. (यह संकलित बीसीएल भी शामिल है।)

+0

अच्छा, मुझे यह नहीं पता था। मुझे लगता है कि मैं सुरक्षित रूप से ऐसे एप्लिकेशन को लिखने में सक्षम हो सकता हूं जो एक दिन 'int.MaxValue' संग्रह संशोधन करेगा :) शीघ्र उत्तर के लिए धन्यवाद। –

संबंधित मुद्दे