【问题标题】:C# object copying explanation?C#对象复制解释?
【发布时间】:2013-10-16 19:34:12
【问题描述】:

在我开始之前,我知道还有其他几个问题可以“回答”这个问题,但不是我能完全理解的方式。这就是我所指的: Deep copying in C#

Why Copying in C# is a terrible idea

我已经进行了相当多的研究,我希望有人可以向我解释如何将对象设置为另一个对象的值。

例如,假设:

myObject bob;
bob = new myObject();
myObject joe
joe = bob

据我所知,joe 现在指向 bob 的 bob 实例。这些对象是否仍然独立运行?

如何创建两个对象,将一个对象的内容复制到另一个对象,并让它们成为两个独立对象,它们的字段、方法和事件分别发生?

很抱歉再次问这个问题,但我似乎在其他任何地方都找不到对我有意义的解释。

【问题讨论】:

  • 完成上述分配后,bob 和 joe 都指向内存中的同一个实例。 bob 和 joe 可以被认为是指针变量。要创建副本,请创建一个新实例,然后复制每个成员。当然,这可以在方法中编码。
  • 我会问自己的第一个问题是“为什么我需要这个对象的精确副本?”如果您发现需要大量彼此独立的对象的相似/相同副本,则可以考虑研究对象工厂样式模式。
  • 您能否详细说明其他答案无法为您解答的具体问题?这些答案似乎没有任何其他问题。似乎您只是在说“我不明白答案”,这并不是一个真正的问题,如果将其解释为一个问题,那将无法回答。
  • 您可以做一个deep or shallow copy ..实现ICloneable 接口,然后克隆该对象调用克隆方法...虽然它是not 建议实现它..创建你自己的代替方法!正如它所做的那样here逐字节

标签: c# .net class object copy


【解决方案1】:

它们都指向同一个实例。如果您想要两个单独的实例,请使用new 运算符来创建第二个。

【讨论】:

    【解决方案2】:

    让我们遍历每一行:

    myObject bob; // Creates a variable of type myObject, but it doesn't point anywhere
    bob = new myObject(); // bob now points to a newly created myObject instance
    myObject joe; // Creates a variable of type myObject, but it doesn't point anywhere
    joe = bob; // joe now refers to the same object as bob
    

    要记住的重要一点是,最后一行复制了引用本身的值。比如bob指向地址1000,joe也会指向那里。因此,如果您更改此地址的任何数据,joebob 都将指向相同的数据。

    但是,欢迎您将 joe 设置为 point 其他位置,这不会影响 bob。换句话说:

    joe = null; // This will not null out bob
    

    如果您想创建myObject全新实例,您必须这样做:

    joe = new myObject(); // This will also not affect bob
    

    现在,如果您尝试在内存中创建 myObject 的新实例并复制现有实例的所有属性,您必须自己执行此操作:

    joe = new myObject();
    joe.X = bob.X; // Assuming X is not a reference itself
    joe.Y = bob.Y; // ...or you'd have to do this recursively
    

    .NET 不提供为您进行此复制的方法。一种常见的模式是为myObject() 创建一个构造函数,它接受myObject 的实例并复制其所有属性:

    joe = new myObject(bob);
    

    【讨论】:

      【解决方案3】:

      是的,bobjoe 都将指向那里完全相同的对象。

      对象的复制确实需要在每个类的基础上完成。假设您有一个只有值类型(可能是一些整数和字符串)的类。复制其中的每个字段都可以。

      但是现在想象一下,如果您的类包含对其他对象的引用(很可能),如果您只是逐个字段地复制此对象,您现在将有两个不同的实例共享一些数据(一个打开的文件,一个网络套接字ETC)。因此,为了可靠地复制一个对象,您应该让该对象创建一个自身的副本,因为它知道它拥有什么样的数据。

      所以答案是在 C# 中没有安全的通用方法来复制对象。

      【讨论】:

        【解决方案4】:

        您在这里混淆了数据和方法。数据定义了对象是什么。例如 circleradius 2. 方法作用于该数据,例如 IncreaseRadius() 复制时,复制的是该数据,而不是方法。方法只是对类数据进行操作并产生特定于类数据的输出。

        没有。它们都指向同一个对象。 bobjoe 只是两个变量,它们在内存中持有对同一对象的引用。如果你通过bob更改数据并从joe读取,你会得到新的值。

        标准的方式是实现ICloneable接口并使用它来创建一个深拷贝。我的意思是你必须在Clone 方法中创建一个新对象并将每个数据成员复制到新创建的对象。如果数据是另一种引用类型,那么您也必须克隆它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多