【问题标题】:Modify class property from byref passed function parameter inside of function从函数内部的byref传递函数参数修改类属性
【发布时间】: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


【解决方案1】:

我认为您可以将属性作为 lambda 表达式传递并使用反射来调用 setter,但将 setter 调用包装在 lambda 中并将其传入可能更容易:

Func1(Sub(value) myClassA.bFlag = value)

Public Sub Func1(flag As Action(Of Boolean))
    ' start some action
    flag(True)
    ' stop some action
    flag(False)
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2018-09-26
    • 2019-05-18
    相关资源
    最近更新 更多