对象复制简单问题?

时间:2009-11-30 14:06:27

标签: c# .net

如果复制一个对象只是创建一个对内存中同一个对象的新引用,那么我不明白为什么它有用,因为它只为同一个对象创建另一个名称。

复制,对我来说意味着在另一个内存位置创建对象的克隆。

然后我可以操纵2个单独的对象,这些对象仅在复制时才相同,但是他们的生活将会不同。

我使用C#。 有人可以解释一下...... 谢谢 约翰

6 个答案:

答案 0 :(得分:1)

复制通常意味着实际创建一个新对象。但是,新对象可能是浅层副本,因此它实际上可能不会保留对新字段副本的引用。

您正在查看的类可能是不可变的,并且类设计者认为不需要内存开销。

答案 1 :(得分:1)

当您想要将对象“传递”到许多组件时,通过引用进行复制是有用的行为,要么允许许多组件修改单个对象的状态,要么允许多个组件使用该对象的功能

此外,通过引用传递可以避免复制值,这通常会为应用程序产生更小的内存占用。

如果您愿意,可以在对象上实现Clone方法,该方法将执行您要求的行为,允许您使用单独的对象。

最后,如果通过引用传递的行为对您的对象看起来不自然(例如,您的对象是基本值,例如坐标数据),则可以创建struct而不是{{1 }}。 class或“结构”按值复制,因此当您将其传递给方法时,将复制整个对象并将副本传递给方法。

答案 2 :(得分:1)

有3种副本

  • 参考副本:为对象指定另一个名称
  • 浅拷贝:将创建没有内部数据的对象骨架的另一个副本
  • 深层复制:将创建对象和数据的另一个副本

您可以在此链接中阅读有关对象副本的更多信息 http://en.wikipedia.org/wiki/Object_copy

答案 3 :(得分:1)

你的理解是正确的,有两个,(实际上是三个,如果你考虑深拷贝和浅拷贝)重现参考对象的方法。

  1. 您可以将变量地址复制到另一个变量(Heap上的相同对象,现在有另一个对象)或
  2. 您可以在堆上创建新对象,并将原始对象属性和字段的值复制到新对象中。这通常称为 Clone ,可以通过两种方式完成 Shallow Deep

    1. 浅拷贝。这里只复制基元,并且,当对象具有引用其他引用类型的属性时,仅复制引用(即地址),这称为浅复制,或者

    2. 深层复制。在这里复制基元,您可以为引用另一个引用类型的每个属性创建新对象。

答案 4 :(得分:0)

我相信如果微软选择以你的方式实施它,其他人会抱怨。这取决于您使用它来说明哪种方式更好的上下文。采用更有效的方式作为默认实现是明智的。

此外,引用类型有点像指针,因此在这种情况下只复制“指针”本身是有意义的。

如果您发现此行为不符合您的要求,您也可以使用自己的实现。

答案 5 :(得分:0)

你是对的,复制会创建一个新对象。我认为这种错误观念来自于对原始对象的思考。复制原始值和复制对象是以不同的方式完成的。

int x = 5;
int y = x;

是x的副本。

Object a = new object();
Object b = a;

b是对a的副本而不是副本的引用。要复制,您需要编写特定的代码来自己克隆对象。