从文档中,我对Array.CopyTo()方法的理解是 -
ICloneable.Clone()也会生成浅拷贝。
所以请使用以下代码 -
void Main()
{
var a = new A();
a.MyProperty = new object();
var listOfA = new List<A>();
listOfA.Add(a);
var arrayOfA = new A[1];
listOfA.CopyTo(arrayOfA);
var clonedA = a.Clone();
listOfA[0].Equals(arrayOfA[0]); //Returns True
clonedA.Equals(a); //Returns False
}
public class A : ICloneable
{
public object MyProperty { get; set; }
public object Clone()
{
return this.MemberwiseClone();
}
}
为什么第一个.Equals()返回true?如果它是浅拷贝,它不应该是假的吗?
答案 0 :(得分:2)
A&#34;浅拷贝&#34;基本上是一个副本,其中不是递归地复制单个元素。但这意味着什么取决于你复制的内容。
集合的浅表副本将具有与原始集合完全相同的元素(引用方式),但将是一个独特的集合。向副本添加新元素不会反映在源中。修改副本中现有元素的属性将反映在源中。
对象的浅表副本将具有与原始对象完全相同的字段值(以引用方式),但将是一个不同的对象。
答案 1 :(得分:0)
根据MSDN:
如果当前实例是引用类型,则Equals(Object)方法测试引用相等性,并且对Equals(Object)方法的调用等同于对ReferenceEquals方法的调用。
当CopyTo()
方法复制引用时,listOfA[0]
和arrayOfA[0]
代表同一个对象。
但是对于MemberwiseClone()
方法,它会创建一个新对象,并在原始对象的成员上执行浅复制,因此新引用不会引用原始对象。
答案 2 :(得分:0)
你的第一个假设可能不对。 Array.CopyTo()不会创建“浅”副本。它只会复制引用类型的引用。 referencesource.microsoft.com看看这里,你会看到CopyTo归结为快速的外部方法,它对它创建的对象一无所知(据我所知)。