2012-08-11 6 views
5

W czasie, gdy .NET Reflector był wolny, użyłem go do wdychania kodu kodu .NET. Doszło do mojej uwagi, że większość zbiorów w .NET 2.0 (wierzę ten ma zastosowanie do obecnych wersjach zbyt) użyć następującego mechanizmu rozpoznawania modyfikacji kolekcji podczas okrążenia:Modyfikowanie wbudowanej kolekcji .NET int.MaxValue razy i więcej - potencjalny błąd przepełnienia

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

Teraz wyobraź sobie hipotetyczny przypadek długiego biegu application (mocno używana usługa sieciowa, która musi mieć minimalny czas przestoju i powinna być stabilna i niezawodna), która przechowuje określoną instancję kolekcji (jeden z wbudowanych typów kolekcji w strukturze .NET) w pamięci tak długo, jak działa. Kolekcja jest modyfikowana na tyle często, że możliwe są modyfikacje int.MaxValue. Czy istnieje ryzyko, że linia version++ w każdej metodzie modyfikacji kolekcji wyrzuci wyjątek przepełnienia (zakładając, że kontrole przepełnienia nie zostaną wyłączone globalnie).

Muszę przyznać, że mam słabe wspomnienia dotyczące szczegółów odzwierciedlonego kodu, ale nie pamiętam, aby używać bloków w okolicach version++. Czy to oznacza, że ​​wbudowane typy kolekcji w .NET nie są odpowiednie dla tak długo działających scenariuszy aplikacji? Czy z czystej ciekawości ktoś napotkał prawdziwy scenariusz, w którym to może się stać?

+1

dotPeek (http://www.jetbrains.com/decompiler/) jest wolne i dobre Dekompilator w przypadku, gdy Historia reflektora pozostawiła w ustach kwaśny smak. – spender

+1

Kod źródłowy BCL (i większość innych bibliotek MSFT .NET) jest udostępniony i dostępny pod adresem http://referencesource.microsoft.com/netframework.aspx –

+1

@spender, dziękuję, dla mnie uczucie to raczej bycie ślepym niż o kwaśnym smaku, ale myślę, że obaj mamy na myśli to samo. Kolejna przydatna rzecz do nauczenia się dzisiaj - nowe narzędzie do dekompilacji, nawet z jetbrains –

Odpowiedz

4

Nie, ponieważ sprawia, że ​​kompilator C# całkowitą arytmetyczna unchecked by default. (może to być zestawiane BCL).

+0

Miło, nie wiedziałem tego. Sądzę, że mógłbym wtedy bezpiecznie zaryzykować napisanie aplikacji, która pewnego dnia dokonałaby modyfikacji kolekcji 'int.MaxValue' :) Dziękuję za szybką odpowiedź. –

Powiązane problemy