是否可以在VB.net中声明一个本地/类实例成员引用变量,以读取/更新另一个变量引用的相同对象 在C++中,有可能做: int x; int& foo = x; // foo is now a reference to x so this sets x to 56 foo = 56;

是否可以在VB.net中声明一个本地/类实例成员引用变量,以读取/更新另一个变量引用的相同对象 在C++中,有可能做: int x; int& foo = x; // foo is now a reference to x so this sets x to 56 foo = 56;,vb.net,variables,declaration,byref,Vb.net,Variables,Declaration,Byref,但是在VisualBasic.net(VB.net)中是否可能有一个等价的版本 我知道VB.net中的ByRef术语,但我只在通过引用函数/子例程传递参数时看到了这一点(通过广泛的研究),以便函数修改调用代码声明的相同变量 但是我没有看到使用ByRef声明变量(作为类成员或局部变量)。我曾尝试使用ByRef来进行这样的声明,但每次尝试的声明顺序都会出现编译器错误 之所以要这样做,是因为我希望一个类实例能够引用另一个类实例中声明的变量 具体来说,我正在处理一些现有的VB.net代码,其中程序逻辑与

但是在VisualBasic.net(VB.net)中是否可能有一个等价的版本

我知道VB.net中的
ByRef
术语,但我只在通过引用函数/子例程传递参数时看到了这一点(通过广泛的研究),以便函数修改调用代码声明的相同变量

但是我没有看到使用
ByRef
声明变量(作为类成员或局部变量)。我曾尝试使用
ByRef
来进行这样的声明,但每次尝试的声明顺序都会出现编译器错误

之所以要这样做,是因为我希望一个类实例能够引用另一个类实例中声明的变量

具体来说,我正在处理一些现有的VB.net代码,其中程序逻辑与VB.net表单类中的UI逻辑混合在一起。我想将程序逻辑从表单代码中分离出来,以便更容易重用。要做到这一点,我需要程序逻辑代码能够“交谈”的形式代码,所以我需要访问它的变量


我正在将Visual Studio 2010 Express与VB.net一起使用,我更愿意留在这个环境中,尽管我知道完整的Visual Studio具有扩展功能。

您好,我不确定VB.net,但我知道如何在C#中实现它,因此我用C#实现了解决方案,然后我使用C#到VB.net转换器来获取VB.net代码。也许它可以帮助你:

C#代码

VB.NET转换

    Protected Sub TestFoo()

      Dim strFooA As String = String.Empty

      GetFoo(strFooA)

      Response.Write(strFooA)
    End Sub

    Private Sub GetFoo(ByRef strFooA As String)
      strFooA = "FooA"
    End Sub

在.NET framework中,指针不像在C/C++中那样存在,因此无法直接实现所需的功能

在这个问题上有一些可能的解决方案

请参见上面的@NathanW答案:

如果您使用的是VB,唯一真正接近指针的就是IntPtr。如果您可以访问C#代码,则可以使用不安全的C#代码来执行指针工作

此外

如果希望能够使用引用,则可以通过使用类来实现:

Private Class RefClass
    Public x As Integer
End Class
然后您可以从另一个引用一个:

Dim bar As New RefClass
Dim foo As RefClass = bar

bar.x = 45

Debug.WriteLine(bar.x) 'outputs 45
Debug.WriteLine(foo.x) 'outputs 45
指针存在,但它们被称为对象引用 (现在,其他海报,请不要在这里与我争论实际的差异。我说的是OP想要完成的高级别任务)

很明显,你不能按照你说的去做——也就是说,通过手术操纵一个成员。但是,如果你能控制代码,你几乎也能做到。从您描述的问题来看,这种方法会更好,因为您可以将引用传递给一个对象,该对象有许多您希望更新的成员,而不必传递许多单独的指针

首先定义一个类:

Class MyScreenValues
    ' Properties will work... using public fields for brevity
    Public TextBox1Value as String
    Public SpinControl1Value as Integer
    public CheckBox1Value as Boolean
End Class
现在,与您发布的代码等效:

Dim x as new MyScreenValues    'int x; 
dim foo as MyScreenValues = x  'int& foo = x;  
'// c++:  foo is now a reference to x so this sets x to 56 
'// .net: foo is now a reference to x so this sets x.SpinControl1Value to 56 
foo.SpinControl1Value = 56; 
如果您正在尝试将指向表单值上每个控件的指针传递给子控件,如下所示:

Button1_Click(...
    Dim MyObject as new BusinessObject
    MyObject.DoSubmit(TextBox1.Text, SpinButton1.Value, CheckBox1.Checked)
您可以使用superbDeveloper提供的方法,并在DoSubmit子项的定义上使用ByRef关键字:

Public Sub DoSubmit(ByRef Name as String, ByRef Age as Integer, ByRef Employed as boolean)
    ... business logic...
然而,这只是给你一个2层的分离。查看MVP、MVC等,但是考虑提交整个视图的数据值。这是一个很大的研究,你可以解决与你现在所拥有的。例如,当表单更改表单值时,您的业务逻辑将触发表单上的事件(实际上,由于VB处理byref属性[=temp variable]的方式,在子类退出之前不会触发事件,但需要考虑它)


还可以将对象的属性映射到具有其他库的窗体属性。在web上查看值注入器。它可以采用webform/winform,甚至可能是WPF表单,并将控件值映射到预定义的对象。非常适合完全分离。

您可能已经知道了足够的信息,可以从以下位置完成工作:;然而,您的评论“在局部变量(可能还有类变量)的声明中不需要ByRef”让我怀疑这里是否有一些混淆

<>初学者,上面的C++例子,<代码> int x;int&foo=x混淆了“引用”的含义。我的C++不是很强,但是从语义上讲,我相信C++引用更像一个混叠机制。在VB(和C#)中,一个引用的操作就像一个识别码,它在内存中定位一个类的实例。VB或C语言都没有C++引用类型的任何东西。p> 到目前为止,您可能已经知道可以将表单作为ByVal参数传递,并且可以毫无问题地更改其属性和字段。(ByVal是VB.NET中的默认值,因此您甚至不需要使用它-在VB6中ByRef是默认值。)如果您足够高兴,可以跳过其余部分。但是,是的,在.NET引用变量的情况下,假设:

Dim objA as New MyClass()
Dim objB as MyClass = objA
然后objA和objB都引用了MyClass的同一个实例。您可以通过objA和objB进行修改,也可以从objA或objB读回,因为它们都影响相同的实例。您可以将objA或objB传递到某个子例程Foo中,其中参数objC作为ByVal传递的对象(即
子Foo(ByVal objC作为对象)
),然后Foo也可以修改该实例


VB的
ByRef
和C#的
ref
表示一个可修改的参数,这意味着传递的是一些“标识码”引用,而不是值。然而,ByVal与ByRef之间的区别是显而易见的,因为在.NET中,“值”类型和“引用”类型之间存在区别,这使许多人混淆了是否需要
ByRef
ref

VisualBasic和C#将变量(和数据类型)分为两类:“值”(或“结构”)和“引用”(或“类”)

“Value”类型表示一个实际的位集合,它表示一个整数、一个布尔值、甚至一个位图或其他类型的对象。在老式的帕兰
Dim objA as New MyClass()
Dim objB as MyClass = objA