vb.net - 默认表单实例何时创建?

标签 vb.net winforms forms

VB.NET 中表单实例的启动顺序和处理非常奇怪。当您引用表单(例如 Form2.Textbox1.Text = "Foo")时,CLR 会自动使用在后台创建的表单实例,并且可以通过 直接访问My.Forms.Form2.

我正在使用通过自定义 Sub Main() 启动的 WinForms 应用程序。这里,应用程序是通过调用 Application.Run(frmMain) 来运行的。

由于我有多个表单需要初始化,我想确切地知道真正的表单实例是在哪一点创建的。它们都是在 Application.Run 中创建的还是仅在我调用 Form2.Show() 时创建?我现在的启动顺序如下:

  1. 子主函数()
  2. Sub Main() 调用 Application.Run(frmMain)
  3. frmMain.Load 调用 frmNotMain.Show()

我现在可以在任何地方找到类似 My.Forms.frmNotMain = New frmNotMain 的行,因此实例的创建位置并不明显。

提前谢谢您。

最佳答案

According to MSDN :

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/

相关文章:

javascript - 提交时仅在 jQuery 中显示一次消息

vb.net - 签名工具错误 : Invalid option:/fd

c# - 无法将必备组件放在与我的应用程序相同的位置

c# - ComboBox SelectedValue 属性不起作用

Javascript 表单输入值更新仅在调试条件下成功

jQuery 如何将一些 json 记录加载到表单字段中?

javascript - 使用 Javascript 为下拉列表设置 selectedvalue

c# - Azure 表的 BulkCopy.WriteToServer 错误(与聚集索引相关)

vb.net - 将字节数据加载到图片框

c# - 是否可以调用 win form 而不是 windows 登录窗口?