.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のビルトインコレクションタイプが、このような長時間実行されるアプリケーションシナリオの目的には適していないことを意味しますか?好奇心の外に、誰かがこれが実際に起こる実際のシナリオに遭遇しましたか?
dotPeek(http://www.jetbrains.com/decompiler/)場合には、無料で良い逆コンパイラであることができるのでリフレクターの物語はあなたの口に酸味を残しました。 – spender
また、BCLソースコード(および他のほとんどのMSFT .NETライブラリ)は共有されており、http://referencesource.microsoft.com/netframework.aspx –
@spenderで利用できます。感謝しています。酸味がありますが、私たちは同じことを意味していると思います。今日学ぶもう1つの便利なこと - ジェットブレーンからの新しいデコンパイラツール –