代码之家  ›  专栏  ›  技术社区  ›  user541686

Array.ConstrainedCopy()只不过是一个备份和复制操作吗?

  •  2
  • user541686  · 技术社区  · 14 年前

    我一直在看 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; }
    }
    

    如果是,它还能做什么?
    如果不是,那么为什么CLR对实现进行如此特殊的处理,而不是在纯C#/.NET代码中?

    1 回复  |  直到 6 年前
        1
  •  3
  •   user743382 user743382    14 年前

    Array.ConstrainedCopy 与您的示例实现不同。 阵列.约束复制 事先检查是否有 任何 副本可能会抛出异常,如果是,则根本拒绝复制。例如,从 int[] object[] 包括拳击 int s、 这可能会引发 OutOfMemoryException 所以 阵列.约束复制 甚至没有试图复制。

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

    发生ArrayTypeMismatchException

    Array.ConstraintdCopy仅适用于可证明兼容的数组类型,而不会对每个数组元素进行任何形式的装箱、取消装箱、加宽或强制转换。更改阵列类型(即,将派生[]复制到基[]),或在CER中对array.copy功能较弱的可靠性契约使用缓解策略,例如克隆阵列或丢弃可能损坏的目标阵列。

    推荐文章