【问题标题】:Forms in VB.NetVB.Net 中的表单
【发布时间】:2008-12-03 17:25:29
【问题描述】:

我来自 c# 背景,正在将一个 vb.net windows 窗体应用程序转换为 c#。 我有一个名为 associateForm 的 Windows 窗体。 在代码中,开发人员引用关联表单如下:-

Private Sub NotifyIcon1_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles EMS.MouseDoubleClick
    If e.Button = Windows.Forms.MouseButtons.Left Then

        If associateForm.WindowState = FormWindowState.Normal And associateForm.Visible = True Then
            associateForm.WindowState = FormWindowState.Minimized
        Else
            associateForm.WindowState = FormWindowState.Normal
        End If

        associateForm.Show()
        associateForm.Focus()
        'bring to front of other windows
        associateForm.Activate()
    End If
End Sub

但问题是 associateForm 没有在执行该方法的类中实例化。类也不是静态的。代码中的任何地方似乎也没有该类的实例。任何人都可以解释为什么这似乎有效,但是当我在 C# 中尝试这个时,它没有。

【问题讨论】:

    标签: vb.net winforms


    【解决方案1】:

    .Net 2.0 及更高版本的 VB.Net 具有称为默认表单实例的东西。当你定义一个表单时,你会得到一个与类型同名的表单的自动实例。

    【讨论】:

    • 来自语言史。在 16 位和 32 位版本中,您向项目添加了一个表单并通过其名称引用它。没有涉及实例化或 NEW 关键字。先做一些研究。
    • 感谢您对此的回复,我真的很难知道这是什么!
    【解决方案2】:

    以前的 cmets 有几个问题。 Joel 的答案基本上是正确的,但有一点需要注意:

    当你定义一个表单时,你会自动获得一个与类型同名的表单实例。

    您实际上只有在您调用它时才获得该实例。在此之前,不会创建默认实例。因此,实例创建被推迟到使用时。

    使用表单的名称作为实例实际上是My.Forms.Formname 的快捷方式,它是编译器生成的所有表单的属性列表。这些属性负责对象的创建。不幸的是,微软决定在全球范围内隐式地提供这些属性(因此是 OP 的问题)。

    之所以存在此功能,是因为 VB.NET 模拟了 VB6 方法,即能够通过名称引用表单的默认实例。

    嗯。虽然此功能 受到 VB 早期版本的启发,但它并不是直接继承的。 VB 7 没有。相反,它是在 VB 8 (= VB 2005) 中重新引入的。

    一个非常愚蠢的“功能”

    实际上,这是一个非常有用的功能,与 VB 的 RAD 开发理念非常吻合。如上所述,不幸的是采用了如此宽松的范围。但除此之外,我非常想知道这个功能有什么“愚蠢”的地方。

    【讨论】:

      【解决方案3】:

      乔尔是正确的。之所以存在此功能,是因为 VB.NET 模拟了 VB6 方法,即能够通过其名称引用表单的默认实例。

      当您将其转换为 C# 时,您需要提供对名为 associateForm 的单个实例的全局访问。有可能在调用此表单之间保留某些内容。在你成功地让它以这种方式工作之后。然后,您可以重构软件并测试以查看本地实例化是否可以正常工作。

      【讨论】:

        【解决方案4】:

        我不能直接回答你的问题,但是...

        我猜您是手动从 VB.Net 转换为 C# - 您是否尝试过使用 automatic convertor 代替?

        【讨论】:

        • 这是大多数自动转换器未涵盖的内容。他们通常只做基本的语法转换,这涉及到重构一些代码。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 2020-06-30
        • 1970-01-01
        相关资源
        最近更新 更多