制約付きの実行領域を理解するために、制約付きの実行領域とその他の正誤表 [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
。
これを考えると、この例の制約付き実行領域の目的を理解するのに苦労しています。
これについての私の理解は正しいですか、それとも何かを見逃していますか?