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

如何在Visual Basic中声明一个全局variables?

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

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

可以做什么(正如其他一些答案所build议的那样)是把所有你想作为一个全局variables的东西声明为静态variables,而不是在一个特定的类中:

Public Class GlobalVariables Public Shared UserName As String = "Tim Johnson" Public Shared UserAge As Integer = 39 End Class 

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

例如,如果你想用你的用户名在你的表单代码中显示一个消息框,你必须这样做:

 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 

您不能通过在定义类的外部键入UserName来访问该variables,您还必须指定定义它的类的名称。

如果完全限定variables的做法令你感到震惊或不安,那么你总是可以将包含全局variables声明的类(这里是GlobalVariables )导入到每个代码文件的顶部(甚至在项目级别该项目的属性窗口)。 然后,你可以简单地通过他们的名字引用variables。

 Imports GlobalVariables 

请注意,这与编译器在Module (而不是Class声明全局variables时幕后执行的操作完全相同 。 在VB.NET中,它提供了与VB以前版本的向后兼容的Module ,一个Module只是一个封闭的静态类(或者在VB.NET中,是Shared NotInheritable Class )。 IDE允许您从模块中调用成员,而无需完全限定或导入对其的引用。 即使你决定走这条路,也值得了解像VB.NET这样的面向对象语言背后发生的事情。 我认为,作为一名程序员,即使您决定使用它们,了解到底发生了什么以及您的工具为您做了什么也是非常重要的。 对于它的价值,我不build议这是一个“最佳实践”,因为我觉得它倾向于模糊和清洁面向对象的代码/devise。 如果C#程序员将上面的代码编写成模块,并让编译器处理所有内容,那么它将更有可能理解您的代码。

请注意,至less与其他答案一样,VB.NET是完全面向对象的语言。 这意味着,除其他外, 一切都是一个客体。 即使是“全局”variables,也必须在类的实例中定义,因为它们也是对象。 任何时候,如果您觉得需要在面向对象的语言中使用全局variables,那么您需要重新考虑您的devise。 如果您只是切换到面向对象的编程,那么在将自己深入到编写代码之前,停下来学习一些基本模式是值得的。

几乎和你总是一样,用“模块”而不是类,只是使用“公共”,而不是旧的“全球”关键字:

 Public Module Module1 Public Foo As Integer End Module 

好的。 我终于find真正有用的东西来回答似乎被问到的问题。

“当需要很多模块和表单的时候,我怎样才能声明一个variables被公开给它们,这样它们每个都引用相同的variables?

令人惊讶的是,我花了相当多的时间在networking上search这个看似简单的问题,只发现了一些含糊不清的东西,这使得我仍然犯了错误。

但是,感谢科迪·格雷(CodyGray)的一个例子 ,我能够看出一个正确的答案。


情况 ; 您有多个模块和/或表单,并希望引用每个或所有的特定variables。

“有效”的方式; 在一个模块中放置以下代码(其中“DefineGlobals”是任意select的名称);

 Public Module DefineGlobals Public Parts As Integer 'Assembled-particle count Public FirstPrtAff As Long 'Addr into Link List End Module 

然后在每个需要处理variables“Parts”的Module / Form中,放置下面的代码(作为“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 

也许是另一种forms; 公共类FormX

 Sub CreateAff() Parts = 1000 End Sub End Class 

这种types的编码似乎已经在我的VB2008快车上工作,似乎是所有需要的(即使没有发现任何未知的文件在后台加载),即使我没有发现“哦,顺便说一句”惊喜细节。 我敢肯定,更好的标准化将是首选,但首要的任务是简单地根据或不标准来获得某种工作。

没有什么比文字上的确切和措辞明确的例子。

再次感谢科迪

将其设为静态(在VB中共享)。

 Public Class Form1 Public Shared SomeValue As Integer = 5 End Class 

公共variables是代码味道 – 尝试重新devise你的应用程序,所以这些都不是必需的。 这里和这里的大部分推理都适用于VB.NET。

在VB.NET中使用全局variables最简单的方法是在类上创build公共静态variables(声明variables为Public Shared )。

如果在类中使用关键字public shared ,则可以在项目中的所有表单中访问全局variables。 如果您在关键字“public”下使用关键字“public”,它也会起作用,但是由于许多原因,这不是最好的做法。

(…是的,我稍微重复一下“科迪·格雷”和“罗伯朗”的说法。)

其中一个问题是当你有两个线程同时调用同一个全局variables的时候。 你会有一些惊喜。 如果你不知道自己的局限性,你可能会有意想不到的反应。 查看Visual Basic .NET中的全局variables,然后下载示例项目!

小评论:我正在使用基于web的应用程序(asp.net)中的模块。 我需要记住,应用程序中的每个人都可以看到我存储在模块variables中的所有内容,请阅读网站。 不仅在我的会议上。 如果我尝试在会话中添加一个计算,我需要创build一个数组来过滤我的会话和其他人的数字。 模块是一个很好的工作方式,但需要专注于如何使用它。

为了防止错误:class级发送给

CarbageCollector

当页面完成时。 我的模块保持活动(只要应用程序没有结束或重新启动),我可以重新使用它的数据。 我使用这个来保存由于IIS处理会话而丢失的数据。

IIS表单身份validation

IIS_session

是不同步的,并与我的模块,我把数据翻越悬崖。

这些答案似乎都没有改变我的任何东西。

我正在将一个旧的Excel程序转换为VB 2008。当然,有很多Excel具体的东西要改变,但引起头痛的东西似乎是整个“公共”问题。

我有大约40个数组都被大约20个模块引用。 数组构成了整个项目的基础,并通过几乎所有的程序来解决。

在Excel中,我只需将它们全部声明为Public。 工作很好。 没问题。 但在VB2008中,我发现它是一个问题。 认为我必须经过数千行代码才能告诉每个公众已经公布的地方,这是荒谬的。 但即使愿意这样做,所提出的计划似乎也没有任何帮助。

看来“公众”仅仅意味着“在这一个模块中公开”。 添加“共享”似乎没有任何改变。 添加模块名称或其他任何东西似乎都没有改变。 每个模块都坚持我在每个模块中声明所有的数组(大约100个其他基本variables)(一个看似向后的前进)。 而“import”位似乎也不知道我在说什么,“无法find”。

我必须同情提问者。 所有这一切似乎都非常糟糕。

第一个公开课的人更有意义。 原始人有多种forms,如果需要全局variables,那么全球class会更好。 想想有人在他身后编码,并且需要在一个你具有智能感知的类中使用一个全局variables,这也将使编码在6个月后的修改变得容易很多。

另外,如果我有一个大脑放屁,像在一个模块级别的例子部分使用,然后想要我的全球部分,我可以做一些事情

 Dim Parts as Integer parts = 3 GlobalVariables.parts += Parts '< Not recommended but it works 

至less这就是为什么我会去上课路线。

在这个博客中的各种答案似乎是由SE的人定义的,他们促进严格遵守面向对象编程的常规规则(使用公共共享(又称静态)的公共类和完全合格的类引用,或者SE编译器显然需要做相同的事情来使其工作的向后兼容性特征(Module)。

作为一个拥有30多年经验的SE,我会提出以下的指导方针:

  1. 如果您正在编写所有新代码(而不是尝试转换旧版应用程序),那么您完全避免使用这些表单,除非在极less数情况下您确实需要静态variables,因为这会导致严重的后果find错误)。 (multithreading和多处理代码需要围绕静态variables的信号量…)

  2. 如果你正在修改一个已经有一些全局variables的小应用程序,那么这些应用程序就不会被模块遮住,也就是说,使用面向对象编程的标准规则来将它们重新创build为公共静态,并且可以全部访问它们资格,以便其他人可以弄清楚是怎么回事。

  3. 如果你有一个巨大的遗留应用程序与几十个或数百个全局variables,通过所有的手段使用模块来定义它们。 在申请工作时没有理由浪费时间,因为你可能已经在花在物业等上的8球之后了。

以上所有内容都可以通过在开始的表单中简单地声明运行时的朋友值来避免。

 Public Class Form1 Friend sharevalue as string = "Boo" 

然后使用Form1.sharevalue从所有表单中访问这个variables

 Public Class Form1 Public Shared SomeValue As Integer = 5 End Class 

答案:

 MessageBox.Show("this is the number"&GlobalVariables.SomeValue)