了解Array.CopyTo()和Equals()

时间:2016-07-23 13:30:26

标签: c# .net arrays

从文档中,我对Array.CopyTo()方法的理解是 -

  1. 该方法会将对象的浅层副本生成到目标数组中。
  2. 如果对象的成员是值类型,则复制它们,如果它们是引用类型,则复制成员refeence
  3. 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?如果它是浅拷贝,它不应该是假的吗?

3 个答案:

答案 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归结为快速的外部方法,它对它创建的对象一无所知(据我所知)。