您是否必须在VB.NET中显式创建表单实例?

时间:2014-03-13 00:47:28

标签: .net vb.net winforms instance explicit

如果项目包含Form类,则表单可以通过以下方式显示:

Form1.Show

或者是否需要首先创建表单实例?

Dim frm As New Form1
frm.Show

2 个答案:

答案 0 :(得分:5)

是的,它可以是default Form instance它留在VB6兼容性的语言中。如果是我,我会像瘟疫一样避免它,它只会混淆水域。改为创建自己的实例。

答案 1 :(得分:5)

正如所建议的,使用表单名称时使用默认实例,而第二个代码段显式创建实例。在这两种情况下都有一个表单类的实例;这只是系统是为您创建它还是您自己创建它的问题。

VB.NET中不存在默认实例,直到VB 2005,这是第三个版本。添加它们是为了使VB6的转换更容易,因为一些VB6开发人员因为必须显式创建对象而感到困惑。他们设法创造了新的混乱,因为它意味着形式似乎与其他类型的行为不同。此外,有些人试图在多线程应用程序中使用默认实例,这会产生问题,因为默认实例是特定于线程的。

在VB.NET中为表单实现单例模式通常没有意义,因为默认实例会为您执行此操作。真正的单身人士的唯一优势是它不会是线程特定的。值得注意的是,如果为您的项目启用了应用程序框架(默认情况下),则启动表单是其类型的默认实例。

就个人而言,除非我需要单例功能,否则我永远不会使用默认实例。它为你做的是让从其他形式访问表单的成员变得更容易,但是任何需要默认实例的东西都是不好的做法。

您可以查看我的几篇博客文章,了解有关默认实例的信息以及如何在没有这些实例的表单之间进行通信:

http://jmcilhinney.blogspot.com.au/2009/07/vbnet-default-form-instances.html http://jmcilhinney.blogspot.com.au/2012/04/managing-data-among-multiple-forms-part.html

请务必阅读第二部分的所有三部分。

回答如何实现单例模式的问题:

Public Class Form1

    ''' <summary>
    ''' The one and only instance.
    ''' </summary>
    Private Shared _instance As Form1

    ''' <summary>
    ''' Gets the one and only instance.
    ''' </summary>
    Public Shared ReadOnly Property Instance As Form1
        Get
            'If there is no instance or it has been destroyed...
            If _instance Is Nothing OrElse _instance.IsDisposed Then
                '...create a new one.
                _instance = New Form1
            End If

            Return _instance
        End Get
    End Property

    'The only constructor is private so an instance cannot be created externally.
    Private Sub New()
        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.

    End Sub

End Class

然后,您只能通过Instance属性与Form1进行交互,例如

Form1.Instance.Show()
Form1.Instance.Activate()

确保显示唯一的实例并具有焦点。