在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#的业余程序员。除了我最近发现的那些之外,一切都很顺利。)
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"类型对象的框架,您将把它实例化为对象。这篇文章应该对此进行更多的解释。