为什么MemberwiseClone()不是虚拟的?在System.Object?

时间:2011-11-08 01:32:30

标签: .net .net-4.0

我在System.Object

中找到了这个
    [SecuritySafeCritical]
    protected object MemberwiseClone();

为什么这不虚拟?如果我将myclass放入对象然后调用MemberwiseClone,这不会中断吗?在这种情况下,它不会调用object.MemberwiseClone(),它不知道我对MemberwiseClone的实现? (我猜它可以用反射作弊,但虚拟可以完全满足它的需要)。我不明白为什么这不是虚拟的?另请注意,Equals,ToString等是(公共)虚拟的。

3 个答案:

答案 0 :(得分:2)

MemberwiseClone由CLR直接实现,因此它确切地知道您的对象是什么类型以及如何进行成员克隆。只有一种方法可以做到这一点,所以没有理由让你用一些专门的逻辑“自定义”行为,比如Equals,ToString等。考虑它的另一种方式:如果你可以覆盖它,你会做什么不同的比不会违反API合同的基础实现?

答案 1 :(得分:0)

如果您真正要问的是,如何编写自己的自定义Clone方法,执行此操作的传统方法是实现ICloneable接口并覆盖其Clone方法。然后你可以像你想的那样虚拟。

答案 2 :(得分:0)

这是MemberwiseClone的实际作用:

protected unsafe object MemberwiseClone()
{
    object clone = RuntimeHelpers.AllocateUninitializedClone(this);
 
    // copy contents of "this" to the clone
    nuint byteCount = RuntimeHelpers.GetRawObjectDataSize(clone);
    ref byte src = ref this.GetRawData();
    ref byte dst = ref clone.GetRawData();
 
    if (RuntimeHelpers.GetMethodTable(clone)->ContainsGCPointers)
        Buffer.BulkMoveWithWriteBarrier(ref dst, ref src, byteCount);
    else
        Buffer.Memmove(ref dst, ref src, byteCount);
    return clone;
}

您可以找到它here