【问题标题】:VB.Net - Variables in ModulesVB.Net - 模块中的变量
【发布时间】:2015-03-10 22:12:33
【问题描述】:

我刚刚偶然发现模块中的公共变量可以被我的主窗体访问(如果不能被其他类/模块访问??)。

我刚刚创建了一个模块来存储我所有的全局变量以供组织使用,并计划在变量名出现在其他地方的地方完全限定它们。

然后,当我从主窗体复制变量、将它们注释掉并将它们粘贴到我的变量模块中时,没有发生错误。我为哈哈运行了我的程序,它运行得很好。我不必使用 [ModuleName].[VariableName]。

为什么从我的表单到模块,但如果我试图从模块访问表单中的变量却不行?

即使它确实有效,我是否仍应使用全名来访问变量(最佳实践)?

【问题讨论】:

  • 在模块中创建的东西与类中的静态变量基本相同。如果您使用一个类Variables 并在其中声明一个变量Public Static AwesomeVariable As Integer,它的工作方式相同。例如,模块是 C# 中的 Public Static class
  • 一般来说,那些 Globals 代表了一些东西或与应用程序中的某个 Actor 相关。最佳实践是将它们放在与该 Actor 相关的类中(例如 UserOptions)。
  • 关于我的评论:在 VB 中,它将被称为 Shared 变量而不是静态变量。对不起,我总是把这两个词弄混了。
  • 模块中的变量不能声明为共享。这就是来自 Visual Studio 的智能感知错误。我想我知道你的意思。 VB 中也有静态和常量。不知道其他 .Net 语言。
  • 我从来没有说过它们可以 ;-) 但是模块中的所有变量都被视为类中的共享变量(它们在幕后)。

标签: vb.net variables module


【解决方案1】:

为什么这项工作可以从我的表单到模块,但如果我是 试图从模块访问我的表单中的变量?

除了上面的cmets...

VB.Net 在幕后神奇地为您为您 完全限定这些模块变量名称。但这只有在您的模块中的变量名称是唯一时才有效。考虑以下情况:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        MessageBox.Show(User) ' ?...which one!?
    End Sub

End Class

Public Module Module1
    Public User As String = "Bob"
End Module

Public Module Module2
    Public User As String = "Joe"
End Module

它无法知道你真正想要哪个User,所以这将导致编译时错误,除非你完全限定它,例如Module1.User

所以,是的,只使用变量名来访问它们并没有什么问题,因为它们在所有模块中都是唯一的(否则它将不起作用)。这样做的一个缺点是您无法立即判断正在访问的值是子/函数的局部变量,还是来自模块。事实上,如果你声明一个与Module中同名的局部变量,局部变量会隐藏Module一,你只能取回局部变量。

正如 Jens 所指出的,变量在内部被转换为 Class 的成员 Public Shared,这意味着它们无需创建 Module 的实例即可存在;这就是为什么您可以简单地访问它们而不使用New 关键字来创建模块的实例。然而,这也是为什么你不能做相反的事情,只通过它们的名字来访问你的表单中的变量......因为你需要你的表单的一个实例并且它不知道你想要哪个(考虑如果你打开了多个表单实例)。

所以仅仅因为你可以,并不意味着你应该。更好的做法是创建一个恰当命名的 Class 并将 Public Shared 成员放入其中。这将迫使您完全限定这些成员可以访问它们,并完全清楚这些值的来源:

Public Class AppData

    Public Shared UserName As String

End Class

您可以使用 AppData.UserName 访问它。

【讨论】:

  • 好答案!在设计器中创建的表单的另一个警告是 VB 为它们创建的默认实例。所以你可以(看起来)访问像Form1.User = "Foo"这样的变量。这似乎是访问一个共享变量,但在幕后调用My.Forms.Form1 = "Foo",这是存储默认实例的位置。这会让它变得非常混乱,让开放的形式看起来像是一件神奇的事情,与其他物体完全不同。只是对您的好答案的补充。
  • 伟大的补充。对于试图学习传递引用的新程序员来说,这些默认的表单实例是一个很大的困惑源。我自己也使用过它们,但我真的认为它们应该在某个时候永久地摆脱它们。我相信 VB.Net 的第一个版本没有它们,它引起了如此大的轰动,他们把它们带回了 .Net 2.0。该死的向后兼容性...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2013-01-04
  • 2010-10-27
  • 2019-09-10
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多