2

私はこれまで見てきましたがArray.ConstrainedCopy、CLRの内部で、その実装が舞台裏で行われている理由を理解するのに苦労しています。

ConstrainedCopy次のこと以上のことをしますか?

[ReliabilityContract(Consistency.WillNotCorruptState, CER.Success)]
static void ConstrainedCopy(Array src, int iSrc, Array dest, int iDest, int len)
{
    Array backup = Array.CreateInstance(dest.GetType().GetElementType(), len);
    Array.Copy(dest, iDest, backup, 0, len);
    try { Array.Copy(src, iSrc, dest, iDest, len); }
    catch { Array.Copy(backup, 0, dest, iDest, len); throw; }
}

もしそうなら、それは他に何をしますか?
そうでない場合、なぜ実装は純粋なC#/。NETコードではなく、CLRによって特別に扱われるのでしょうか。

4

1 に答える 1

3

はい、Array.ConstrainedCopyサンプルの実装とは異なります。コピーが例外をスローする可能性があるかArray.ConstrainedCopyどうかを事前にチェックし、例外が発生した場合は、コピーをまったく拒否します。たとえば、からへのコピーにはsのボックス化が含まれ、これにより、がスローされる可能性があるため、コピーを試みません。int[]object[]intOutOfMemoryExceptionArray.ConstrainedCopy

object[] dst = { 1, 2 };
int[] src = { 3, 4 };
Array.ConstrainedCopy(src, 0, dst, 0, 2);

ArrayTypeMismatchExceptionが発生しました

Array.ConstrainedCopyは、各配列要素のボックス化、ボックス化解除、拡張、またはキャストの形式を使用せずに、互換性が証明可能な配列型でのみ機能します。アレイタイプを変更する(つまり、Derived[]をBase[]にコピーする)か、CER for Array.Copyのそれほど強力ではない信頼性コントラクトで、アレイのクローンを作成したり、破損している可能性のある宛先アレイを破棄したりするなどの緩和戦略を使用します。

于 2012-08-17T09:04:32.327 に答える