Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否必须在VB.NET中显式创建表单实例?_.net_Vb.net_Winforms_Instance_Explicit - Fatal编程技术网

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

是否必须在VB.NET中显式创建表单实例?,.net,vb.net,winforms,instance,explicit,.net,Vb.net,Winforms,Instance,Explicit,如果一个项目包含一个表单类,该表单可以通过以下方式显示: Form1.Show 还是需要先创建表单的实例 Dim frm As New Form1 frm.Show 是的,它可以,这是它留在VB6兼容的语言。如果是我,我会像躲避瘟疫一样躲避它,它只会把水弄脏。创建您自己的实例。正如建议的那样,使用表单名称将使用默认实例,而第二个代码段将显式创建实例。在这两种情况下,都有form类的实例;这只是系统是为你创建还是你自己创建的问题 直到VB 2005(第三个版本)之前,VB.NET中不存在默认实

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

Form1.Show
还是需要先创建表单的实例

Dim frm As New Form1
frm.Show

是的,它可以,这是它留在VB6兼容的语言。如果是我,我会像躲避瘟疫一样躲避它,它只会把水弄脏。创建您自己的实例。

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

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

在VB.NET中为表单实现单例模式通常没有意义,因为默认实例会为您实现。真正的单例的唯一优点是它不是特定于线程的。还值得注意的是,如果为您的项目启用了应用程序框架(默认情况下是这样),则启动窗体是其类型的默认实例

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

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

确保你阅读了第二部分的全部三个部分

要回答如何实现singleton模式的问题,请执行以下操作:

这样可以确保显示一个且唯一的实例并具有焦点。

它不是“留在”中的。VB.NET是从头开始构建的,因此它包含的所有内容都添加了。默认实例直到2005年才出现在VB.NET中,这是第三次迭代。有一件事我认为我们双方都同意,那就是这个特性已经解决了很多问题。
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
Form1.Instance.Show()
Form1.Instance.Activate()