我在System.Object
中找到了这个 [SecuritySafeCritical]
protected object MemberwiseClone();
为什么这不虚拟?如果我将myclass放入对象然后调用MemberwiseClone,这不会中断吗?在这种情况下,它不会调用object.MemberwiseClone(),它不知道我对MemberwiseClone的实现? (我猜它可以用反射作弊,但虚拟可以完全满足它的需要)。我不明白为什么这不是虚拟的?另请注意,Equals,ToString等是(公共)虚拟的。
答案 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: