多个引用指向同一字符串?

3
在VB.NET中是否可以进行以下简化?
例如:将text变量指向另一个字符串:
Class Form1
    Sub New()
        Dim text As (what_type?) = AddressOf TextBox1.Text  'simplification
        If text = "foo" Then text = "bar"  'actually accessing TextBox1.Text
    End Sub
End Class

我认为这是不可能的,但是我可能错了。


2
在.NET中,这种事情实际上是不可能的 - 它使用引用而不是指针。CLR可以移动和移动东西;TextBox1(及其属性,如Text)可以立即移动到其他位置的内存中。 - James Thorpe
你想通过这段代码实现什么目标? - dbasnett
@dbasnett - 在事件处理程序的主体中,对于类似“ImageOutputDirectoryTextBox.Text”的事物出现4次以上,可以提高可读性和可维护性。 - miroxlav
@JamesThorpe - 你是说C#也适用于这个吗?(即使在C#中也不能进行这种简化吗?) - miroxlav
2个回答

3

VB.NET没有指针。你可以使用属性

Public Property Text As String
    Get
        Return TextBox1.Text
    End Get
    Set(value As String)
        TextBox1.Text = value
    End Set
End Property

您可以使用属性作为层来隐藏控件本身,只暴露相关信息:

If Text = "foo" Then Text = "bar"  

通过这种方式,您甚至可以更改控件(例如Label)而不会破坏代码。

另一种方法是使用lambda表达式:

Dim setText = Sub(str As String) TextBox1.Text = str
setText("test")
Dim getText = Function() TextBox1.Text
Dim text As String = getText()

我看到这个可以通过过程性方式实现,每次读取TextBox1.Text。但是我想保持局部作用域。那么在C语言中,使用指向相同字符串的指针怎么样? - miroxlav
@miroxlav:不,那是不可能的。谢天谢地,VB.NET没有指针。 - Tim Schmelter
@miroxlav,在VB.NET托管代码中没有指针。此外,字符串是不可变的。 - the_lotus
好的,当我想要避免使用属性时,我仍然可以使用一组本地方法(在Sub()Function()内部):Dim text As Func(Of String) = Function() TextBox1.Text(+ Sub()用于设置值)。 - miroxlav
@miroxlav:是的,你可以使用lambda表达式,我已经编辑了我的答案。 - Tim Schmelter
谢谢,我已经在另一个答案中添加了lambda表达式,但我想我会接受你的建议。 - miroxlav

0

在本地范围内:

使用本地声明的函数和过程(任何一个都是可选的):

Public Class Form1
    Sub New()

        Dim text As Func(Of String) = Function() TextBox1.Text
        Dim setText As Action(Of String) = Sub(value) TextBox1.Text = value

        If text() = "foo" Then setText("bar")

    End Sub
End Class

你可以像其他答案中提到的那样使用属性,并将其标记为“private”吗? - James Thorpe
@JamesThorpe - 如果我需要在多个方法中引用它,那么我会这样做。但是如果我只需要在单个方法中使用它,有时避免使用额外的属性可能会更好。 - miroxlav
个人而言,这看起来更加令人困惑。如果你只需要用于一个方法,你可以随时使用With语句 - the_lotus
@the_lotus - 是的,With是另一种可行的选择,迄今为止没有人提到它 :) 它的缺点是额外的代码缩进级别和可能只能替换一个对象。但也许这可以帮助一些读者解决他们特定的问题。 - miroxlav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接