2012-08-11 11 views
5

Zurück in der Zeit, als .NET Reflektor frei war, habe ich es verwendet, um in den .NET-Framework-Code zu schnappen. Es kam zu meiner Aufmerksamkeit, dass die meisten Sammlungen in .NET 2.0 (ich glaube, das ist auch für die aktuellen Versionen anwendbar ist) den folgenden Mechanismus Sammlung Änderungen im laufenden Schleifen erkennen:Ändern einer integrierten .NET-Sammlung int.MaxValue Mal und mehr - potenzieller Überlauffehler

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

nun den hypothetischen Fall eines langen währenden vorstellen Anwendung (ein stark genutzter Webdienst, der minimale Ausfallzeiten haben muss und stabil und zuverlässig sein sollte), der eine bestimmte Auflistungsinstanz (einen der integrierten Auflistungstypen im .NET-Framework) so lange im Speicher behält, wie sie ausgeführt wird. Die Sammlung wird häufig genug geändert, so dass Änderungen möglich sind. Besteht die Gefahr, dass die Zeile version++ in jeder Änderungsmethode der Auflistung eine Überlaufausnahme auslöst (vorausgesetzt, die Überlaufprüfungen sind nicht global deaktiviert).

Ich muss zugeben, dass ich schwache Erinnerungen an die Details des reflektierten Codes habe, aber ich erinnere mich nicht an die Verwendung von unckecked Blöcken um version++ Operationen. Bedeutet das, dass integrierte Sammlungstypen in .NET für den Zweck eines solchen lang laufenden Anwendungsszenarios nicht geeignet sind? Nur aus Neugier, hat jemand ein reales Lebensszenario erlebt, in dem das tatsächlich passieren könnte?

+1

dotPeek (http://www.jetbrains.com/decompiler/) ein kostenloser und gute Decompiler ist, der für den Fall, Reflector Story hat einen sauren Geschmack in Ihrem Mund hinterlassen. – spender

+1

Auch der BCL-Quellcode (und die meisten anderen MSFT .NET-Bibliotheken) ist freigegeben und verfügbar unter http://referencesource.microsoft.com/netframework.aspx –

+1

@spender danke, für mich ist das Gefühl mehr wie blind geblendet werden einen sauren Geschmack haben, aber ich denke, wir beide meinen das Gleiche. Eine weitere nützliche Sache, um heute zu lernen - ein neues Decompiler-Tool, sogar von Jetbrains –

Antwort

4

Nein, weil der C# -Compiler macht Integer-Arithmetik unchecked by default. (Dies schließt die kompilierte BCL.)

+0

Schön, das wusste ich nicht. Ich denke, ich könnte dann sicher in eine Anwendung schreiben, die 'tt.MaxValue' Collection Änderungen eines Tages machen würde :) Danke für die schnelle Antwort. –