2012-08-14 49 views
2

我有类似下面的自定义类;使用时更新所有值的类的多个实例=

Public MyClass 
    Public Property MyText() As String 
End Class 

然后在我的代码页中,我有以下VB.NET代码;

Dim obj1 As New MyClass 
Dim obj2 As New MyClass 

obj1 = obj2 
obj1.MyText = "Test" 

我的问题是,当执行下面的一段代码时,obj2.MyText也会更新。我怎样才能避免这种情况?

obj1.MyText = "Test" 

谢谢。

回答

2

这就是问题所在:

obj1 = obj2 

这副本的obj2obj1值。该值对象 - 这是一个参考对象。所以现在obj1obj2指向同一个对象,所以你所做的任何更改通过一个可变被其他可以看出。

我意识到这是VB而不是C#,但你仍然可以找到我article on reference types and value types有用。基本上,您需要了解引用类型的行为方式。

+0

有没有解决办法?而不必手动设置所有属性? – Blahhh 2012-08-14 13:31:57

+0

@AlanAgius:你可以使用Object.MemberwiseClone获得一个浅层克隆,但是你需要确定是否有一些属性需要更深入的克隆等。 – 2012-08-14 13:32:58

+0

@AlanAgius:如果你的对象是可序列化的,你可以序列化对象,然后将其反序列化为一个新对象。在大部分情况下,这在功能上等同于创建深度克隆。但是,这种技术比手工编码的深度克隆效率低。 – Brian 2012-08-14 17:21:51

0

的原因是,OBJ1并不是obj2的副本,但是是一个参考。当更改obj1时,obj2也会自动更改,因为它指向相同的内存位置/实例。

-1

发生这种情况,因为.NET是基于指针。

所以你分配一个poiter。不是

你必须使用功能将数据从OBJ2复制到OBJ1

例如:http://msdn.microsoft.com/en-us/library/system.string.copy.aspx#Y100

+0

这只适用于引用类型(类),而不是值类型(结构)。 – 2012-08-14 13:51:41

+0

请谈谈引用,而不是指针。引用通常使用指针(通常作为地址实现)来实现,但这是一个实现细节。请参阅Eric Lippert的文章[参考资料不是地址](http://blogs.msdn.com/b/ericlippert/archive/2009/02/17/references-are-not-addresses.aspx)。 – Brian 2012-08-14 17:16:11