2

在 VB.NET 中,我们可以将原始对象作为参数传递而不实例化它吗?例如,我的项目formA和formB中有两个表格。现在我有这个代码。

Public Sub AddForm(Form Outer, Form Inner)
    Inner.FormBorderStyle = FormBorderStyle.None
    Inner.TopLevel = False;
    Inner.Dock = DockStyle.Fill
    Inner.WindowState = FormWindowState.Normal
    Outer.Controls.Add(Inner)
    Inner.BringToFront()
    Inner.Show()
End Sub

现在我可以在任何情况下使用它,例如:

AddForm(formA, formB)

但 ...

在 C# 中使用相同的代码

public static void AddForm(Form Outer, Form Inner)
{
    Inner.FormBorderStyle = FormBorderStyle.None;
    Inner.TopLevel = false;
    Inner.Dock = DockStyle.Fill;
    Inner.WindowState = FormWindowState.Normal;
    Outer.Controls.Add(Inner);
    Inner.BringToFront();
    Inner.Show();
} 

我不能这样称呼它:

AddForm(formA, formB);

它给出了错误

formB 是类型,但用作变量。

相反,我必须这样称呼它:

AddForm(A, new B());

除此之外,在 VB.NET 中的任何类(如 formA)中,如果我键入 formA,我可以看到那里存在的所有对象和控件,但在 C# 中看不到。同样,我必须创建一个新实例才能查看所有控件。如果我想相互操纵两个正在运行和工作的实例,这将成为一个问题。那么我在这里缺少什么基本的东西?

(我是一名业余程序员,正在从 VB.NET 迁移到 C#。对于我最近发现的那些,事情进展顺利。)

4

3 回答 3

2

FormA 和 FormB 是 VB 中的类,它们可以像在 C# 中一样被实例化。

但是,Microsoft 在 VS2005 中向 VB.Net 添加了对自动默认表单实例的支持,以支持从 VB 经典迁移而对创建和管理表单实例的需求感到困惑的开发人员。

但是,这不被认为是最佳编程实践,因为它可能导致各种问题,例如无法从后台线程访问表单以及无法创建表单的多个实例。

一旦您了解了 OOP 和类实例化,就绝对没有理由使用默认实例。

事实上,您可以通过Sub New在声明的表单中创建一个来禁用默认表单实例的使用Friend(以便可以在项目的其他地方创建它):

Friend Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.

End Sub

或通过修改 Public Sub New 以包含参数:

Public Sub New(SomeValue As String)

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.

End Sub

在任何一种情况下,对表单默认实例的任何引用都将导致以下两个编译时错误,无论何时引用默认实例:

“Form1”是“WindowsApplication1”中的一种类型,不能用作表达式。

对非共享成员的引用需要对象引用。

说了这么多关于您当前应用程序在 VB.Net 中的工作方式之后,您对 C# 问题的具体回答是,您始终需要在 C# 中创建表单的新实例。

例如:

AddForm(new formA(), new formB());
于 2012-01-14T19:58:11.263 回答
0

问:我只想知道在 vb.net 中我们可以将原始对象作为参数传递而不实例化它

答:您要查找的内容称为“按引用传递”。

这里有一些很好的例子:

http://www.java2s.com/Code/VB/Language-Basics/ObjectparameterpassedbyValueandbyReference.htm

这是微软文档:

http://msdn.microsoft.com/en-us/library/ddck1z30.aspx

于 2012-01-14T17:14:34.400 回答
-1

我不确定,但我很确定 VB 会执行这种“伪面向对象编程”,其中 formA 和 formB 是对象,而不是类。在您的情况下,您无需在 VB 中创建对象,您只是在操作对象 formA 和 formB。

当您迁移到 C# 时,您正在处理对象和类。您的类是“formA”,但它只是您将实例化为对象的“formA”类型对象的框架。 这篇文章应该再解释一下。

于 2012-01-14T17:15:19.270 回答