我只是偶然发现我的主表单可以访问模块中的公共变量(如果不是其他类/模块?)。
我只是创建了一个模块来存储我的所有全局变量以进行组织,并计划完全限定变量名称,这些名称出现在其他地方。
然后没有错误发生,因为我从我的主窗体复制变量,将它们注释掉,并将它们粘贴到我的模块中以获取变量。我为ha-ha运行了我的程序,它运行得很好。我不必使用[ModuleName]。[VariableName]。
为什么这可以从我的表单转到模块,但如果我试图访问我的表单中的变量而不是模块?
即使它确实有效,我是否仍应使用全名访问变量(最佳实践)??
答案 0 :(得分:2)
为什么这项工作从我的表格转到模块,但如果不是,那就不行 试图访问我的表单中的变量吗?
除上述评论外......
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
。
所以,是的,只使用变量名称来访问它们是没有错的,因为它们在所有模块中都是唯一命名的(否则它只是赢了工作)。这样做的一个缺点是,您无法立即判断所访问的值是否为子/函数的局部变量,或者它是否来自模块。实际上,如果声明一个与模块中名称相同的局部变量,则局部变量隐藏模块一,您将只返回局部变量。
正如Jens所指出的,变量在内部转换为Public Shared
的{{1}}成员,这意味着它们不存在需要创建模块的实例;这就是为什么你可以简单地访问它们而不使用Class
关键字来创建模块的实例。这也是为什么你不能这样做的原因,只是通过他们的名字来访问你的表格中的变量...因为你需要一个你的表格实例,它不知道你想要哪一个(考虑是否有多个表格实例打开)。
因为你可以,并不意味着你应该这样做。创建一个名称恰当的New
并将Class
成员放入其中是一种更好的做法。这将迫使您完全限定这些成员访问它们并使其完全清楚这些值的来源:
Public Shared
您可以使用Public Class AppData
Public Shared UserName As String
End Class
访问该内容。