【发布时间】:2014-06-19 18:59:13
【问题描述】:
我了解我手头的问题,但正在寻找推荐的解决方法。
我有一个包含 get/set 属性的类,当使用特定值调用 set 时,它将执行一些操作。
Public Class A
Private _bFlag As Boolean
Public Property bFlag() As Boolean
Get
Return _bFlag
End Get
Set(value As Boolean)
_bFlag = value
If (value) Then
...do something...
End If
End Set
End Property
End Class
当我将类变量作为 ByRef 传递给本地例程时,直到函数完成后才会触发 Set 属性。但是我在切换标志的地方执行了一些瞬态操作。我想立即收到有关变量切换的通知。
...
Dim myClassA as New A
...
<------Here the bFlag is False
Func1(myClassA.bFlag)
<------Here the bFlag is False since Func1 completed with the bFlag set as False
<------ the Set was never called since the variable never changed at this level
Public Sub Func1(ByRef flag as Boolean)
... start some action
flag = True
... stop some action
flag = False
End Sub
我知道这是 link 的预期操作,其中包含示例:
Sub CopyBackByRef_Explained()
Dim v1 = New C1
Dim vbTemp = v1.P1
FunctionWithInt(vbTemp)
v1.P1 = vbTemp
End Sub
通过引用传递的变量首先被制作一个临时副本以传入函数。
我怎样才能做到这一点,以便我可以立即收到有关 ByRef 传递的变量更改的通知?
【问题讨论】:
-
How can ... get immediate notification你的意思是在运行时代码中还是在 IDE 中?让属性设置器做一些超出验证的有意义的事情通常是个坏主意。请考虑一种方法。 -
有什么理由必须通过 BYREF 吗?
-
@Plutonix 运行时代码
-
@Steve 由于变量在内部被修改,我想在函数完成后保存任何更改
-
当你传递一个复杂的对象,比如一个类,byval,一个指向原始对象的指针被传递,这意味着在方法中对对象的更改会影响原始对象。当您通过引用传递复杂对象时,它必须制作对象的副本以在方法结束时发回。这就是为什么在方法完成之前您不会触发属性“setter”的原因。通过你的课程 byval 会得到你想要的。
标签: vb.net class pass-by-reference