2012-08-11 5 views
5

.NET Reflectorがフリーだった頃には、.NETフレームワークのコードに気をそらすために使いました。今、長時間実行の仮想的なケースを想像組み込みの.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 2.0のほとんどのコレクションは、ループ中に、コレクションの変更を認識するために、次のメカニズムを使用します(私はこれがあまりにも現在のバージョンにも適用可能であると考えている)ことを私の注意に来ました特定のコレクションインスタンス(.NETフレームワークのビルトインコレクションタイプの1つ)を実行中メモリ内に保持するアプリケーション(ダウンタイムが最小限で、安定性と信頼性が高くなければならない頻繁に使用されるWebサービス)コレクションは頻繁に変更され、int.MaxValueの変更が行われる可能性があります。コレクションのすべての変更メソッドのversion++行がオーバーフロー例外をスローするリスクがあります(オーバーフローチェックがグローバルに無効になっていないと仮定します)。

私は、反射したコードの詳細の弱い思い出があることを認めなければなりませんが、version++の操作の周りにはunckeckedブロックの使用を覚えていません。これは、.NETのビルトインコレクションタイプが、このような長時間実行されるアプリケーションシナリオの目的には適していないことを意味しますか?好奇心の外に、誰かがこれが実際に起こる実際のシナリオに遭遇しましたか?

+1

dotPeek(http://www.jetbrains.com/decompiler/)場合には、無料で良い逆コンパイラであることができるのでリフレクターの物語はあなたの口に酸味を残しました。 – spender

+1

また、BCLソースコード(および他のほとんどのMSFT .NETライブラリ)は共有されており、http://referencesource.microsoft.com/netframework.aspx –

+1

@spenderで利用できます。感謝しています。酸味がありますが、私たちは同じことを意味していると思います。今日学ぶもう1つの便利なこと - ジェットブレーンからの新しいデコンパイラツール –

答えて

4

いいえ、C#コンパイラは、整数演算unchecked by default.(これはコンパイルされたBCLを含む。)

+0

ニース、私はそれを知らなかった。私は、 'int.MaxValue'コレクションの修正をいつか行うアプリケーションを書くことを安全に試みることができたと思います。迅速な返答をありがとう。 –