VB.NET:变量范围

时间:2013-02-01 11:37:36

标签: vb.net scope

目标:填写一些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完成后,回到FillingTextBoxesnewObject.Property2的值现在为"something else" ,即使这发生在另一个功能中。

我怎么可能解决这个问题?

1 个答案:

答案 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"

并且您没有任何问题,因为您正在使用同一对象的新副本而不是集合中的引用。