繁体   English   中英

在C#和VB.NET中传递参数

[英]Argument passing in C# and VB.NET

在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#的业余程序员。对于最近发现的问题,一切进展顺利而且很干净。)

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

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

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

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

实际上,可以通过在声明为Friend的表单中创建Sub New来禁用默认表单实例的使用(以便可以在项目的其他位置创建它):

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

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

答:您要查找的东西称为“通过引用传递”。

这里有一些很好的例子:

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

这是Microsoft文档:

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

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

当您迁移到C#时,您正在处理对象和类。 您的类是“ formA”,但它只是将要实例化为对象的“ formA”类型对象的框架。 本文应对此进行更多说明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM