传递C#和VB.NET的参数

时间:2012-01-14 17:06:04

标签: c# vb.net function parameters migrating

在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());

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

(我是一名从VB.NET迁移到C#的业余程序员。对于我最近想到的那些事情,事情变得越来越顺利。)

3 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

  问:我只想知道在vb.net中我们可以传递原始对象   没有实例化的论证

答:您正在寻找的是“通过参考传递”。

以下是一些很好的例子:

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

以下是Microsoft文档:

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

答案 2 :(得分:-1)

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

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