声明全局、静态变量

3

我正在尝试在Visual Studio中设置一个全局变量,但我无法将其设置为静态。是否有办法让我将变量设置为静态并在不同方法之间共享,或者每次更改变量时保存变量的某种方式?


1
在VB.NET中,Static被翻译为Shared。使用以下方式调用:ClassName.SharedVariableName。必须将其声明为Public,才能从类外部访问。请注意,这不仅在方法之间共享,还跨越不同的线程,这可能会导致锁定或不正确的结果(例如在ASP.NET中)。 - Tim Schmelter
谢谢你对“Shared”是静态的确认。看起来我要么在我的工作中面临运行时错误,要么正在使用变量的“Shared”形式。你能给我一个例子吗? - user3568182
你能发布你的代码吗? - Matt Wilko
2个回答

9
你有两个选项:
1 - 创建一个包含共享变量的类(这与C#中的静态变量相同)
    Public Class GlobalVariables
        Public Shared Bar As String
    End Class

然后您可以使用类名称访问此内容:

GlobalVariables.Bar = "Hello world"

2 - 创建一个模块(类似于C#中的静态类)

    Public Module GlobalVariables
        Public Bar As String
    End Module

您可以在代码中像这样访问此值:
Bar = "Goodbye cruel world"

我所做的是将共享变量放在与使用该变量的方法相同的类中,并以变量名而不是类名引用它。因为它位于同一个类中,所以这可能是错误的原因。另外,我是否应该像按钮点击函数一样添加一个方法(例如)? - user3568182

1
如果您使用@Matt Wilko提供的1号选项,可以通过类的对象实例或者引用类而不需要对象引用来引用共享成员。两种方式都指向并增加相同的变量,因此引用相同的值。尽管Visual Studio编译器提供了关于引用对象实例的警告并表示它将不会被评估,但它仍然可以编译。编译器的建议是使用类名。
Public Class GlobalVariables
    Public Shared Foo As Integer
End Class

将以下内容插入表单中,并从按钮点击事件过程中调用IncrementIntegers(),您会发现myGlobalVariables.Foo和GlobalVariables.Foo都返回20。
Private Sub IncrementIntegers()
   Dim myGlobalVariables As New GlobalVariables
   myGlobalVariables.Foo = 0
   GlobalVariables.Foo = 0
   myGlobalVariables.Foo += 10
   GlobalVariables.Foo += 10
   Dim iLocalInt1 = myGlobalVariables.Foo 
   MessageBox.Show("myGlobalVariables.Foo = " & iLocalInt1.ToString)
   Dim iLocalInt2 = GlobalVariables.Foo 
   MessageBox.Show("GlobalVariables.Foo = " & iLocalInt2.ToString)
End Sub

注意,使用选项1时,Foo必须用类名或对象名进行限定。使用选项2时,它是一个模块而不是类,因此无法创建对象引用。公共变量可以在不使用模块名称限定的情况下进行引用,除非在另一个模块中出现具有相同名称的变量,在这种情况下,编译器会抛出名称冲突错误。例如,
Public Module1

   Public Foo As String

End Module

Public Module2

   Public Foo As String

End Module

移除 Module2 后,Foo 可以在任何地方被调用。

Foo = "Happy birthday"

有了Module2,Foo必须用名称限定,因为它们指向不同的变量,代表不同且独立的值。

Module1.Foo = "Goodbye cruel world"
Module2.Foo = "Hello new world"

这个问题已经得到解答和解决,谢谢大家。 - user3568182

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