在Visual Studio 2010和VB.NET中声明全局变量

Tal*_*Tal 41 vb.net global-variables

如何在Visual Basic中声明全局变量?

需要从所有Visual Basic表单中访问这些变量.我知道如何为特定表单声明一个公共变量,但是如何为我项目中的所有表单执行此操作?

Cod*_*ray 74

没有办法声明全局变量,因为你可能在VB.NET中想象它们.

可以做的(正如其他一些答案所建议的那样)是将您想要作为全局变量处理的所有内容声明为静态变量,而不是在一个特定的类中:

Public Class GlobalVariables
    Public Shared UserName As String = "Tim Johnson"
    Public Shared UserAge As Integer = 39
End Class
Run Code Online (Sandbox Code Playgroud)

但是,您需要在代码中的任何位置完全限定对这些变量的所有引用.从这个意义上讲,它们不是您可能从其他语言中熟悉的全局变量类型,因为它们仍然与某个特定类相关联.

例如,如果要在表单的代码中显示带有用户名的消息框,则必须执行以下操作:

Public Class Form1: Inherits Form

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
        MessageBox.Show("Hello, " & GlobalVariables.UserName)
    End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

您不能通过UserName在定义它的类之外键入来简单地访问变量- 您还必须指定定义它的类的名称.


如果完全限定变量的做法因任何原因而恐吓或扰乱你,你总是可以GlobalVariables在每个代码文件的顶部导入包含全局变量声明的类(这里)(甚至在项目级别,在项目的属性窗口).然后,您可以简单地通过名称引用变量.

Imports GlobalVariables
Run Code Online (Sandbox Code Playgroud)

请注意,当您在a中声明全局变量而不是a 时,这与幕后编译器为您做的完全相同.在VB.NET中,它提供了与以前版本的VB向后兼容的模块,它只是一个密封的静态类(或者,在VB.NET术语中).IDE允许您从模块中调用成员,而无需完全限定或导入对它们的引用.即使您决定走这条路,也值得了解VB.NET等面向对象语言背后的情况.我认为作为一名程序员,即使您决定使用它们,了解正在发生的事情以及您的工具究竟为您做了什么也很重要.对于它的价值,我不建议将其作为"最佳实践",因为我觉得它倾向于默默无闻,并且干净的面向对象的代码/设计.如果编写如上所示的C#程序员将更好地理解你的代码,而不是将它塞进模块并让编译器处理所有内容.ModuleClassModuleShared NotInheritable Class


请注意,至少有一个其他答案提到,VB.NET是一种完全面向对象的语言.这意味着,除其他外,一切都是一个对象.甚至"全局"变量也必须在类的实例中定义,因为它们也是对象.每当您觉得需要在面向对象语言中使用全局变量时,您需要重新考虑您的设计.如果你只是转向面向对象的编程,那么在进一步编写代码之前,停下来学习一些基本模式是值得的.


RBa*_*ung 21

与您总是一样的方式,使用"模块"而不是类,只使用"公共"而不是旧的"全局"关键字:

Public Module Module1
    Public Foo As Integer
End Module
Run Code Online (Sandbox Code Playgroud)

  • 感谢VB 6和串行downvotes的小回调.值得指出的是,当您编写此代码时,编译器正在执行*与我的答案中所解释的完全相同,并且由于VB.NET向后兼容VB 6,IDE允许您使用非限定引用来访问模块中定义的成员.我绝对不要**推荐这个作为VB.NET的最佳实践. (9认同)
  • 它们不是全局变量.请注意,在引用您的答案时,您仍然将该术语放在引号中.我并不是说你错了,它可能更符合提问者所要求的内容.但我不同意我的回答是不正确的.至少可以理解你写的任何一种语言幕后的一些内容,而我所说的一切都是不真实的.VB.NET中不存在全局变量,尽管你有一种假装方法是正确的. (7认同)

小智 6

好的.我终于找到了真正有效的方法来回答似乎被问到的问题;

"当需要许多模块和表单时,如何声明变量对所有模块都公开,以便它们各自引用相同的变量?"

令我惊讶的是,我花了相当多的时间在网上搜索这个看似简单的问题,除了模糊之外什么也没发现,这让我仍然遇到错误.

但是由于Cody Gray与一个例子的联系,我能够辨别出一个正确的答案;


情况 ; 您有多个模块和/或表单,并希望从每个或所有引用特定变量.

"一种"有效的方式; 在一个模块上放置以下代码(其中"DefineGlobals"是任意选择的名称);

Public Module DefineGlobals

Public Parts As Integer                 'Assembled-particle count
Public FirstPrtAff As Long              'Addr into Link List 
End Module
Run Code Online (Sandbox Code Playgroud)

然后在需要处理变量"Parts"的每个模块/表单中,放置以下代码(作为"InitForm2"表单的示例);

Public Class InitForm2
Private Sub InitForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Parts = Parts + 3

End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

也许是另一种形式; 公共类FormX

Sub CreateAff()

   Parts = 1000

End Sub 

 End Class
Run Code Online (Sandbox Code Playgroud)

这种类型的编码似乎已经在我的VB2008 Express上运行了,而且似乎现在都需要(没有任何未知文件在后台加载),即使我找不到"哦顺便说一句......"的惊喜细节.而且我确信更高程度的标准化会更受欢迎,但第一项任务就是让所有工作都有效,无论是否有标准.

没有什么比明确的,措辞好的,明确的例子更好.

再次感谢,科迪


Jür*_*ock 5

使其静态(在 VB 中共享)。

Public Class Form1

   Public Shared SomeValue As Integer = 5

End Class
Run Code Online (Sandbox Code Playgroud)


Ode*_*ded 2

公共变量是一种代码味道 - 尝试重新设计您的应用程序,这样就不再需要它们了。这里这里的大部分推理都适用于 VB.NET。

在 VB.NET 中拥有全局变量的最简单方法是在类上创建公共静态变量(将变量声明为Public Shared)。

  • -1:我真的不喜欢提议的解决方案是使用另一种方法:有时我**被迫**使用_this_方法(例如:遗留系统,维护项目,客户想要这样,你可以触摸的静态军事代码库只有损坏的东西,...) (2认同)