According to MSDN:
当您通过 My.Forms.Form1 访问 Form 时,工厂方法会检查 Form1 的实例是否已打开。如果是,则返回该实例。否则,将创建并返回 Form1 的一个实例。
所以本质上它是在显示之前创建并调用Sub New(不是在某处创建并在需要时保留)。该链接包含此代码,显示了它如何创建这些默认实例:
'Code ... generated by the compiler
Public m_Form1 As Form1
Public Property Form1() As Form1
Get
m_Form1 = Create__Instance__ (Of Form1)(m_Form1)
Return m_Form1
End Get
Set(ByVal Value As Form1)
If Value Is m_Form1
Return
End If
If Not Value Is Nothing Then
Throw New ArgumentException("Property can only be set to Nothing.")
End If
Dispose__Instance__ (Of Form1)(m_Form1)
End Set
End Property
但是,您说的是默认(“怪异”)实例方法,一开始是不明智的。这主要是为了提供与 VB6 类型代码的兼容性,您只需执行 myForm.Show() 来实例化并显示表单(可能适用于不真正了解实例化或 OOP 的修补程序)。
表单是类,应该通过显式创建实例来处理;所以,一般来说:
Dim frm As New frmMain ' NEW creates the instance
frm.Show
您可以在表单的Sub New 中的InitializeComponent 上设置断点,以查看它何时被调用。要创建对它的全局引用,就像您可能对任何其他类一样:
Friend frmMain As MainForm ' no instance yet
Friend myMain As MainClass
Public Sub Main
' do this before any forms are created
Application.EnableVisualStyles()
myMain = New MainClass()
myMain.DoStuff()
frmMain = New MainForm() ' instanced (NEW)
Application.Run(frmMain)
End Sub
同样:
Dim frm2 = New frmNotMain ' declare and instance
' short for:
Dim frm2 As frmNotMain ' declare frm2
frm2 = New frmNotMain ' create instance
frm2.Show
在所有情况下,当您使用New 运算符创建新表单时,将调用您的表单的Sub New。 VB 试图通过重复使用New 来明确这一点,但使用默认实例实际上隐藏在表单工厂中。