如果复制一个对象只是创建一个对内存中同一个对象的新引用,那么我不明白为什么它有用,因为它只为同一个对象创建另一个名称。
复制,对我来说意味着在另一个内存位置创建对象的克隆。
然后我可以操纵2个单独的对象,这些对象仅在复制时才相同,但是他们的生活将会不同。
我使用C#。 有人可以解释一下...... 谢谢 约翰
答案 0 :(得分:1)
复制通常意味着实际创建一个新对象。但是,新对象可能是浅层副本,因此它实际上可能不会保留对新字段副本的引用。
您正在查看的类可能是不可变的,并且类设计者认为不需要内存开销。
答案 1 :(得分:1)
当您想要将对象“传递”到许多组件时,通过引用进行复制是有用的行为,要么允许许多组件修改单个对象的状态,要么允许多个组件使用该对象的功能
此外,通过引用传递可以避免复制值,这通常会为应用程序产生更小的内存占用。
如果您愿意,可以在对象上实现Clone
方法,该方法将执行您要求的行为,允许您使用单独的对象。
最后,如果通过引用传递的行为对您的对象看起来不自然(例如,您的对象是基本值,例如坐标数据),则可以创建struct
而不是{{1 }}。 class
或“结构”按值复制,因此当您将其传递给方法时,将复制整个对象并将副本传递给方法。
答案 2 :(得分:1)
有3种副本
您可以在此链接中阅读有关对象副本的更多信息 http://en.wikipedia.org/wiki/Object_copy
答案 3 :(得分:1)
你的理解是正确的,有两个,(实际上是三个,如果你考虑深拷贝和浅拷贝)重现参考对象的方法。
您可以在堆上创建新对象,并将原始对象属性和字段的值复制到新对象中。这通常称为 Clone ,可以通过两种方式完成 Shallow 或 Deep 。
浅拷贝。这里只复制基元,并且,当对象具有引用其他引用类型的属性时,仅复制引用(即地址),这称为浅复制,或者
深层复制。在这里复制基元,您可以为引用另一个引用类型的每个属性创建新对象。
答案 4 :(得分:0)
我相信如果微软选择以你的方式实施它,其他人会抱怨。这取决于您使用它来说明哪种方式更好的上下文。采用更有效的方式作为默认实现是明智的。
此外,引用类型有点像指针,因此在这种情况下只复制“指针”本身是有意义的。
如果您发现此行为不符合您的要求,您也可以使用自己的实现。
答案 5 :(得分:0)
你是对的,复制会创建一个新对象。我认为这种错误观念来自于对原始对象的思考。复制原始值和复制对象是以不同的方式完成的。
int x = 5;
int y = x;
是x的副本。
Object a = new object();
Object b = a;
b是对a的副本而不是副本的引用。要复制,您需要编写特定的代码来自己克隆对象。