VB.NET 中表单实例的启动顺序和处理非常奇怪。当您引用表单(例如 Form2.Textbox1.Text = "Foo"
)时,CLR 会自动使用在后台创建的表单实例,并且可以通过 直接访问My.Forms.Form2
.
我正在使用通过自定义 Sub Main()
启动的 WinForms 应用程序。这里,应用程序是通过调用 Application.Run(frmMain)
来运行的。
由于我有多个表单需要初始化,我想确切地知道真正的表单实例是在哪一点创建的。它们都是在 Application.Run
中创建的还是仅在我调用 Form2.Show()
时创建?我现在的启动顺序如下:
- 子主函数()
- Sub Main() 调用
Application.Run(frmMain)
frmMain.Load
调用frmNotMain.Show()
我现在可以在任何地方找到类似 My.Forms.frmNotMain = New frmNotMain
的行,因此实例的创建位置并不明显。
提前谢谢您。
最佳答案
When you access Form through My.Forms.Form1, the factory method checks to see if an instance of Form1 is already open. If it is, that instance is returned. Otherwise, an instance of Form1 is created and returned.
所以本质上它是在显示之前创建并调用 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
来阐明这一点,但对于默认实例,所有这些实际上都隐藏在表单工厂中。
关于vb.net - 默认表单实例何时创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24906660/