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

本文关键字:参数 NET VB | 更新日期: 2023-09-27 18:20:13

在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#的业余程序员。除了我最近发现的那些之外,一切都很顺利。)

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

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

然而,微软在VS2005中为VB.Net添加了对自动默认表单实例的支持,以支持从VB经典迁移而来的开发人员,因为他们对创建和管理表单实例的需求感到困惑。

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

一旦您了解了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());

Q: 我只想知道,在vb.net中,我们可以将原始对象作为一个没有实例化的参数

A: 您要查找的内容被称为"通过引用传递"。

以下是一些很好的例子:

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

这是微软的文档:

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

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

当您迁移到C#时,您正在处理对象和类。您的类是"formA",但它只是一个"formA"类型对象的框架,您将把它实例化为对象。这篇文章应该对此进行更多的解释。