3

制約付きの実行領域を理解するために、制約付きの実行領域とその他の正誤表 [Brian Grunkemeyer]を読んでいますが、次のサンプルを理解するのに問題があります。

RuntimeHelpers.PrepareConstrainedRegions();
try {
    // Prepare my backout code
    MethodInfo m = _list.GetType().GetMethod("RemoveAt", new Type[] { typeof(int) });
    RuntimeHelpers.PrepareMethod(m.MethodHandle);

    IEnumerator en = c.GetEnumerator();
    while(en.MoveNext()) {
        _list.Insert(index++, en.Current);
        // Assuming that these lines aren't reordered.
        numAdded++;
    }
    _version++;
}
catch(Exception) {
    // Reliable backout code
    while(numAdded > 0) {
        _list.RemoveAt(index--);
        numAdded--;
    }
    throw;
}

私の理解では、tryブロックは制約されておらず、finally ブロックと catch ブロックのみが制約されています。これは、tryブロック中に非同期例外 (ThreadAbortException など) がいつでもスローされる可能性があることを意味します。特に、 の前後にスローされる可能性がありnumAdded++ます_list.Insert。この場合、バックアウト コードは から削除する項目が少なすぎます_list

これを考えると、この例の制約付き実行領域の目的を理解するのに苦労しています。

これについての私の理解は正しいですか、それとも何かを見逃していますか?

4

1 に答える 1