【发布时间】:2013-08-03 06:17:35
【问题描述】:
我知道deep copy、shallow copy 和how to deep copy 等是什么,但我的主要疑问是何时深度复制对象引用?或多久一次?
场景 1:
考虑一段代码,完整代码见http://pastebin.com/WEgeBFNb
class Box{
Position pos;
Box(Position p){
pos = p;
}
Position getPosition(){
return pos;
}
}
还有一个main() 喜欢:
public class Sample{
public static void main(String args[]){
Position pos = new Position(3,5);
Box box = new Box(pos);
pos.setX(5);
System.out.println( box.getPosition().getX());
// Will print 5, but I want Box to retain its value
}
我通过以下方式达到了上述要求:
Box(Position p){
pos = new Position(p); // Deep cloning
}
那么我在Position 中也必须有一个复制构造函数,比如:
Position(Position p){
x = p.x;
y = p.y;
}
但我的问题是:何时使用深度克隆?
场景 2: 例如,考虑一段 c# 代码。
List<Accounts> = Mysession.getAllAccounts();。在这里,我希望返回对象的变化不能反映在会话对象中。 (这种情况不仅在 C# 中,而且通常在任何oop 语言中)
所以,如果我开始深度克隆,那么,这不是一件容易的事,因为它会更深 5 级的对象,并具有 has-a 关系
再一次,我知道要获得准确的 100%,我必须进行深度克隆。同意。
- 什么更常见?返回引用或对象的副本?
- 我听说,深度克隆是一个繁琐的过程,必须避免。那么多久可以进行一次深度克隆?
- 能否提供一些示例场景(不需要代码)。
- 在像上面
box示例中进行初始化时,必须使用克隆pos = new Position(p)?还是正常分配pos = p?
【问题讨论】:
-
如果您的值对象仅包含 System.ValueType 作为字段,您可以使用 struct 而不是 class.so 在这种情况下您可以简单地使用 pos=p 而不是 pos = new Position(p)。跨度>
-
@Frank59 考虑另一个类,它与另一个对象有
has-a关系。在这里说 `new Room(myroom)`Room包含一个Box。在这种情况下,在Room构造函数中我必须这样做,this.box = new Box(room.getBox());[深度克隆] 还是简单地this.box = room.getBox()[参考复制]? -
如果你只使用 structs (Box is struct) 和 ValueTypes(Box fields are value types and structs ) 就可以使用 neBox=oldBox; (自动深拷贝),但如果你有 Box 作为类或有对 Box 字段的引用,你需要实现深拷贝算法。阅读更多msdn.microsoft.com/en-us/library/saxz13w4.aspx
标签: c# oop object reference deep-copy