在开始之前,我知道还有其他几个问题可以“回答”这个问题,但不是我能够理解的方式。这就是我所说的: Deep copying in C#
Why Copying in C# is a terrible idea
我做了很多研究,我希望有人可以向我解释如何将对象设置为另一个对象的值。
例如,让我们说:
myObject bob;
bob = new myObject();
myObject joe
joe = bob
根据我的研究,joe
现在指向bob的bob
实例。这些对象是否仍然独立运行?
如何创建两个对象,将一个对象的内容复制到另一个对象,并将它们分成两个单独的对象,其字段,方法和事件是单独出现的?
我很抱歉再次提出这个问题,但我似乎无法在其他任何地方找到对我有意义的解释。
答案 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
也指向那里。因此,如果您更改此地址的任何数据,则joe
和bob
都会指向相同的数据。
但是,我们欢迎您在其他地方将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)
是的,bob
和joe
都会指向那里完全相同的对象。
对象的复制确实需要在每个类的基础上完成。假设你有一个只有值类型的类(可能是一些整数和字符串)。复制其中的每个字段都可以正常工作。
但是现在想象一下,如果你的类保存对其他对象的引用(很可能),如果你只是按字段复制这个对象,你现在将有两个不同的实例共享一些数据(一个打开的文件,一个网络套接字)等等)。因此,为了可靠地复制对象,您应该让该对象创建自己的副本,因为它知道它拥有什么类型的数据。
所以答案是没有安全的通用方法来复制C#中的对象。
答案 3 :(得分:2)
您在此处将数据与方法混淆。数据定义了对象是什么。 E.g circle
radius
2.方法对该数据采取行动,例如IncreaseRadius()
复制时,将复制此数据,而不是方法。方法只对类数据进行操作,并生成特定于类数据的输出。
没有。他们都指向同一个对象。 bob
和joe
只是2个变量,它们在内存中保存对同一对象的引用。如果您通过bob
更改数据并从joe
读取数据,则会获得新值。
标准方法是实现ICloneable
接口并使用它来创建深层副本。我的意思是你必须在Clone
方法中创建一个新对象,并将每个数据成员复制到新创建的对象。如果数据是另一种引用类型,那么你也必须克隆它。