我的解决方案被错误地描述了,并且对回答这个问题的各种可能方法存在一些混淆,所以我编辑了我的原始帖子,以比较和对比本页详细讨论的三种主要方法。
解决方案 1:使用 VB.NET 默认表单实例
将此行放在后面Dim mainmenu As New MainMenu
:
mainmenu.Show()
您可能会有两个 MainMenu 表单。这是因为 VB 允许您仅通过使用其类名来引用表单的静态实例。所以你可以说 ie MainMenu.Property = value
,它会在 VB 创建的静态实例上运行。
尝试删除该行Dim mainmenu As New MainMenu
。这可能是您需要做的所有事情(只要您 Show() 表单),因为您将引用与类名相同。
方案二:遵循Singleton设计模式(简化版,无线程安全)
单例设计模式确保一个类只能有一个实例。将此代码放入您的 MainMenu 肯定会导致屏幕上出现一些错误。
Public Class MainMenu
' static (shared) instance of this class
Private Shared _instance As MainMenu
' function which returns the static instance
' with lazy initialization (constructor is called once GetInstance is
Public Shared Function GetInstance() As MainMenu
If _instance Is Nothing Then
_instance = New MainMenu()
End If
Return _instance
End Function
' private constructor to restrict instantiation of this class (only allowed in GetInstance)
Private Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
End Sub
' all the rest of your original MainMenu code here
End Class
修复错误的方法是使用一个变量来保存对 MainMenu 实例的引用。简单地说,在你使用表格之前,mainmenu
用一个变量替换,比如:myMainMenu
Dim myMainMenu As MainMenu = MainMenu.GetInstance()
myMainMenu.Show()
解决方案 3:创建您自己的实例
解决方案 1和解决方案 3之间存在差异。在解决方案 1中,如果您只使用默认实例,您将只有一个表单实例。此解决方案允许您拥有任意数量的实例!你可能不需要这个,但是这里......
您将再次创建一个名为 myMainMenu 的 MainMenu 新实例,但这次您直接调用构造函数。
Dim myMainMenu As New MainMenu()
myMainMenu.Show()
无论您在何处使用名称调用表单,都将其mainmenu
替换为myMainMenu
. 我有没有提到我们称它为 myMainMenu 而不是 mainmenu,因为我们不想使用与类名相同的名称?(VB 不区分大小写,所以mainmenu
= MainMenu
,但由于默认实例,这很容易混淆。编译器使用上下文来确定我们是在谈论类本身还是类的默认实例......)使用类名仅在以下情况下有效您引用解决方案 1中的默认静态实例。
这个解决方案的吸引人之处在于您可以同时拥有多个 MainMenu 实例。所以你可以把它放在后面:
Dim myMainMenu2 As New MainMenu()
myMainMenu2.Show()
瞧,您打开了两个 MainMenu。但你可能不需要两个!
概括
为什么有这么多方法?
好吧,添加第一种方法是为了吸引 VB6 程序员使用 VB.NET,因为这就是在 VB6 中完成的方式!准确地说,在VB6中也可以这样,但是一些脑残的程序员还是选择了方法3。但是默认的实例方法之所以如此普遍,是因为它对于普通程序员来说非常容易使用——尤其是所有那些外行在 VBA 中使用它!
第二种方法在某些情况下是优选的,但在其他情况下不是。它是单例设计模式的简单实现。查看 Douglas Barbie's answer 中的链接,以获得对它的体面解释以及 Java 中的一些示例。它列出了你需要使用它的所有时间的一个很好的总结——一个应该只有一次实例的记录器、一个配置加载器、一个工厂或其他实例生成器——这些可能超出了你的范围,但也许只是想想Microsoft Office 中的打印对话框。一次只需要打开一个打印窗口。这是一个很好的例子。你的代码需要这个吗?遵循模式允许这种行为,但我在示例中放置了一些额外的配置。如果应用程序足够简单,它可能不需要它。
第三个是面向对象编程的典型示例(了解 OOP 是一个很好的起点;仅此一项知识就可以为您提供在未来解决此类问题的工具)。它使用您创建的名为 MainMenu 的类,并可能使用该类的多个实例,称为objects。这样做的一个优点是您可以拥有同一个类的两个对象实例,但这些对象具有不同值的属性。想想类的两个实例Car
,一个有Car.Make = "Ford"
,另一个Car.Make = "Chevy"
. 这两款车,但它们的属性值不同。这与前两个的不同之处仅在于您可以拥有多个实例。如果我们想获得技术,您可以合并解决方案 1 和 3,并使用默认实例并制作您自己的实例,但几乎所有讨论它的人都会警告这一点(谷歌“VB.NET 表单默认实例”以获取更多信息)那件事)。
最后,如果你在小范围内编写代码,那么它对你来说是可靠的。