我认为我有时间问题。它困惑我为什么。
在事件的触发器上,我调用一个函数来更新一个值:
Private Sub t0_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles t0.Click
Input.ppProperty = "blank"
UpdateRecord("Hey", Input.ppProperty)
MsgBox(Input.ppProperty)
End Sub
UpdateRecord()应该将属性Input.ppProperty更新为值“Hey”。它会更新它,但直到UpdateRecord()完成。代码:
Sub UpdateRecord(ByVal updateValue As String, ByRef recordToUpdate As String)
If recordToUpdate <> Nothing Then
MsgBox(updateValue & " " & recordToUpdate & " " & Input.ppProperty)
End If
recordToUpdate = updateValue
If recordToUpdate <> Nothing Then
MsgBox(updateValue & " " & recordToUpdate & " " & Input.ppProperty)
End If
End Sub
输出:
Hey Blank Blank'初始值
功能结束时嘿嘿空白的价值 嘿'功能完成时的财产价值
它应该是:
期望的输出:
Hey Blank Blank'初始值
嘿嘿嘿'在功能结束时的价值观 嘿'功能完成时的财产价值
注意区别,在函数完成之前,属性不会更新。 为什么呢?
修改 另外,我将如何解决此问题,以便在功能中进行更新?
答案 0 :(得分:2)
当您传递属性ByRef
时,会发生以下等效操作:
Dim temporaryValue As String = Input.ppProperty
UpdateRecord("Hey", temporaryValue)
Input.ppProperty = temporaryValue
没有直接解决这个问题。一个可能的解决方案是重写UpdateRecord
方法,以便您可以将整个对象(Input
)传递给它并直接操作属性值。只有这样才能直接反映这一变化。
答案 1 :(得分:0)
我认为它与。Strings
有关,.Net是一种不可变类型。
你得到一个在ByRef中传递然后返回的临时字符串,导致之后设置Input.ppProperty
。
这样的事情:
Dim tempInput As String = Input.ppProperty
UpdateRecord("Hey", tempInput)
Input.ppProperty = tempInput
由于Input
似乎在两种情况下都在范围内,为什么不这样做呢。
Sub UpdateRecord(ByVal updateValue As String)
Input.ppProperty = updateValue
End Sub
然而,如果事实并非如此,我将需要再考虑一下。