如何在VB中保存对字段的引用?

问题描述 投票:0回答:1

在VB中,我有一个类进行一些标准验证。我想要做的是声明一些变量,然后创建一个包含指向变量的指针的验证器类的实例,然后在稍后执行验证器来测试指向的字段中的值。

像这样的东西:

public class MyData
  public property foo as string
  public property bar as string

  dim vfoo as validator
  dim vbar as validator

  public sub new()
    vfoo=new validator(&foo) ' i.e. & operator like in C
    vbar=new validator(&bar)
  end sub

  public sub validate()
    vfoo.validate
    vbar.validate
  end sub       
end class

public class validator
  dim _field as string* ' i.e. * like in C
  public sub new(field as string*)
    _field=field
  end sub

  public sub validate
    if string.isnullorempty(_field) then
      throw SomeException
    else if not SomeOtherTest(_field) then
      throw SomeOtherException
  end sub

问题是,据我所知,在VB中没有像C指针那样的东西。有没有相当简单的方法来做到这一点?

目前我在调用validate()函数时传递字段值,但这并不理想,因为我希望能够创建特定于给定调用者的验证器列表,然后遍历列表。但是当我循环时,我怎么知道从MyClass传入哪个值,除非我有一个巨大的选择语句来键入一些“字段代码”? (当然,在现实生活中,不仅有两个领域,比如这个例子,还有不少。)

我只是大脑冻结了,有一个简单的方法吗?或者这不能在VB中完成,因为没有指针这样的东西?

vb.net
1个回答
1
投票

与Java一样,VB不直接使用指针(它可以补偿库/框架调用的位置)。在垃圾收集语言的上下文中,我无法想象这种验证方式会很好。

但为了好玩,也许基于lambda的解决方案可能适合?:

    Public Class MyData
        Public Property foo As String
        Public Property bar As String

        Dim vfoo As validator
        Dim vbar As validator

        Public Sub New()
            vfoo = New validator(Function() foo)
            vbar = New validator(Function() bar)
        End Sub

        Public Sub validate()
            vfoo.validate()
            vbar.validate()
        End Sub
    End Class

    Public Class validator
        ReadOnly _fieldFunc As Func(Of String)
        Public Sub New(fieldFunc As Func(Of String))
            _fieldFunc = fieldFunc
        End Sub

        Public Sub validate()
            Dim _field = _fieldFunc()
            If String.IsNullOrEmpty(_field) Then
                Throw New Exception("NullOrEmpty")
            ElseIf Not SomeOtherTest(_field) Then
                Throw New Exception("SomeOtherTest")
            End If
        End Sub

        Public Function SomeOtherTest(f As String) As Boolean
            Return True
        End Function

    End Class
© www.soinside.com 2019 - 2024. All rights reserved.