C#对象复制说明?

时间:2013-10-16 19:34:13

标签: c# .net class object copy

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

Why Copying in C# is a terrible idea

我做了很多研究,我希望有人可以向我解释如何将对象设置为另一个对象的值。

例如,让我们说:

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

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

如何创建两个对象,将一个对象的内容复制到另一个对象,并将它们分成两个单独的对象,其字段,方法和事件是单独出现的?

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

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

让我们看看每一行:

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);

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:2)

您在此处将数据与方法混淆。数据定义了对象是什么。 E.g circle radius 2.方法对该数据采取行动,例如IncreaseRadius()复制时,将复制此数据,而不是方法。方法只对类数据进行操作,并生成特定于类数据的输出。

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

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