目标:填写一些TextBox
问题:当第一个TextBox
被填充时,下一个的值会受到影响。它分三步进行。
第一步。说我必须填写两个TextBox。公共职能部门这样做:
Public Sub FillingTextBoxes(Name As String)
'Fetching my object from a collection
Dim newObject As MyClass = MyCollection.Item(Name)
'Filling two textboxes
With newObject
TextBox1.Text = .Property1.ToString
TextBox2.Text = .Property2.ToString
MyCollection是公开的Microsoft.VisualBasic.Collection
。
第二步。填写TextBox1
会触发TextChanged
事件。另一个公共函数更改同一对象的值:
Public Sub SomeOtherFunction(Name As String)
Dim newObject As MyClass = MyCollection.Item(Name)
newObject.Property2 = "something else"
第三步,它来了。当SomeOtherFunction
完成后,回到FillingTextBoxes
,newObject.Property2
的值现在为"something else"
,即使这发生在另一个功能中。
我怎么可能解决这个问题?
答案 0 :(得分:2)
如果您在集合中存储的内容是自定义类,则需要实现允许深层复制的clone
函数。
克隆功能允许您获取对象引用并返回相同类型的新副本,该副本是对不同对象的新引用。例如,如果你有这个:
public class MyClass
public Property1 as string
public Property2 as string
public sub new()
Property1 = string.empty
Property2 = string.empty
end sub
public function clone() as MyClass
dim returnThis as new MyClass
returnThis.Property1 = Property1
returnThis.Property2 = Property2
return returnThis
end function
end class
然后你可以调用这样一个新的深层拷贝:
Public Sub SomeOtherFunction(Name As String)
Dim newObject As MyClass = MyCollection.Item(Name).clone()
newObject.Property2 = "something else"
并且您没有任何问题,因为您正在使用同一对象的新副本而不是集合中的引用。