VB中如何持有字段引用?验证类绑定变量实现方法咨询
嗨,这个问题我之前也帮人捋过~VB确实没有C那种直接的指针,但咱们有好几种接地气的方式实现类似“跟踪变量当前值”的效果,不用每次验证都手动传值,下面给你两种最常用的方案:
方案1:使用委托(
Func(Of T))实现动态取值 这种方式最轻便,不用额外写类,直接利用VB的委托特性,让验证类持有一个“获取当前值”的方法,每次验证时调用这个方法就能拿到变量的最新值。
先定义泛型版的验证类(类型更安全):
Public Class Validator(Of T) ' 持有获取目标变量当前值的委托 Private ReadOnly _getValue As Func(Of T) ' 自定义验证规则 Private ReadOnly _validationRule As Func(Of T, Boolean) ' 错误提示文本 Public Property ErrorMessage As String Public Sub New(getValue As Func(Of T), validationRule As Func(Of T, Boolean), errorMsg As String) _getValue = getValue _validationRule = validationRule ErrorMessage = errorMsg End Sub ' 执行验证的核心方法,自动获取变量当前值 Public Function Validate() As Boolean Dim currentValue = _getValue.Invoke() Return _validationRule.Invoke(currentValue) End Function End Class
使用示例:
' 声明你要验证的变量 Dim myAge As Integer = 17 ' 创建验证器实例,用Lambda表达式直接引用myAge,每次Validate都会取最新值 Dim ageValidator As New Validator(Of Integer)( Function() myAge, Function(val) val >= 18, "年龄必须大于等于18岁" ) ' 第一次验证:当前值17,返回False Console.WriteLine(ageValidator.Validate()) ' 输出 False ' 修改变量值 myAge = 20 ' 第二次验证:当前值20,返回True Console.WriteLine(ageValidator.Validate()) ' 输出 True
这个方案的优势是代码简洁、无额外类依赖,适合单纯需要读取变量值做验证的场景。
方案2:自定义泛型包装类(Value Holder)
如果觉得委托不够直观,或者需要让验证类同时支持读写变量,可以写一个简单的泛型包装类,把变量“装”进去,验证类持有包装类的实例,就能直接访问变量的当前值。
先定义包装类:
Public Class ValueHolder(Of T) ' 包裹目标变量的属性 Public Property Value As T Public Sub New(initialValue As T) Value = initialValue End Sub End Class
再修改验证类,让它持有包装类实例:
Public Class Validator(Of T) Private ReadOnly _valueHolder As ValueHolder(Of T) Private ReadOnly _validationRule As Func(Of T, Boolean) Public Property ErrorMessage As String Public Sub New(valueHolder As ValueHolder(Of T), validationRule As Func(Of T, Boolean), errorMsg As String) _valueHolder = valueHolder _validationRule = validationRule ErrorMessage = errorMsg End Sub Public Function Validate() As Boolean ' 直接读取包装类里的当前值 Return _validationRule.Invoke(_valueHolder.Value) End Function End Class
使用示例:
' 用包装类包裹变量 Dim myAgeHolder As New ValueHolder(Of Integer)(17) ' 创建验证器,传入包装类实例 Dim ageValidator As New Validator(Of Integer)( myAgeHolder, Function(val) val >= 18, "年龄必须大于等于18岁" ) ' 第一次验证:False Console.WriteLine(ageValidator.Validate()) ' 修改包装类里的值(等价于修改原变量) myAgeHolder.Value = 20 ' 第二次验证:True Console.WriteLine(ageValidator.Validate())
这个方案的优势是语义清晰,如果需要让验证类修改变量值,直接操作_valueHolder.Value即可,适合需要双向操作的场景。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

