对象在vb.net中隐式实例化?

Oli*_*ver 8 .net c# vb.net vb6

我正在维护一个同时具有VB.NET和c#组件的应用程序.我认为这两种语言只在语法上有所不同,但我发现VB.NET中有一个奇怪的特性,它不存在于C#中.

在VB.NET中,我有以下类:

Public Class bill_staff Inherits System.Windows.Forms.Form
    ....
End Class
Run Code Online (Sandbox Code Playgroud)

如果我想在C#中使用这个类,我这样做:

using (var frm = new bill_staff())
    frm.ShowDialog();
Run Code Online (Sandbox Code Playgroud)

但是,在VB.NET代码中,类可以像这样使用:

bill_staff.ShowDialog();
Run Code Online (Sandbox Code Playgroud)

ShowDialog 在元数据中定义如下:

Public Function ShowDialog() As System.Windows.Forms.DialogResult
Run Code Online (Sandbox Code Playgroud)

所以在VB.NET中,可以在类上调用实例方法.据我所知,这似乎隐式地创建了一个类的新实例,然后在该对象上调用该方法.在C#中,这是不可能的 - 必须在类上调用静态方法,并且必须在对象上调用实例方法.

我在互联网上找不到任何关于此的信息.这个功能叫做什么,是不是很好的做法?

该项目最初是从VB6转换而来的 - 这是一些奇怪的遗留功能吗?

Ňɏs*_*arp 11

是的,这是遗留行为.类没有在VB中显示,直到V4,在这之前Form1.Show的方式展现形式.为了保持以前的代码兼容(VB3也很受欢迎),保留了旧方法.

.NET仍然支持它作为显示表单的合法手段.最初,添加它是为了便于将VB6代码迁移到VB.NET.但也是为了让在VB中运行的东西变得容易 - MS将其称为触手可及的功能和类似的短语.

基本上,它为修补程序提供了一种简单的编程方式,而无需了解对象和OOP.想象一下如果Form1.Show抛出错误我们会遇到的问题.

显式实例化是更好的方法,因为它是面向对象的,并且Form2当您真正想要使用现有实例时,使代码不太可能引用或创建新代码.

  • NET不会在后台创建一个,而VB在使用默认实例方法(“ Form1.Show”)时会创建一个。没有浪费,因为“ Dim frm As New Form1()”仅创建一个表单实例。使用默认实例可能会导致与范围有关的许多问题... (2认同)
  • @Keith,这是[默认实例]中某些问题的另一种较长的说明(http://stackoverflow.com/a/28290434/1070452) (2认同)

Dav*_*jas 5

对于表单,VB在后台为您创建一个默认实例。例如,以下VB:

Public Class bill_staff
    Inherits System.Windows.Forms.Form
End Class

class testclass
    sub testmethod()
        bill_staff.Show()
    end sub
end class
Run Code Online (Sandbox Code Playgroud)

等效于以下C#:

public class bill_staff : System.Windows.Forms.Form
{

    private static bill_staff _DefaultInstance;
    public static bill_staff DefaultInstance
    {
        get
        {
            if (_DefaultInstance == null)
                _DefaultInstance = new bill_staff();

            return _DefaultInstance;
        }
    }
}

internal class testclass
{
    public void testmethod()
    {
        bill_staff.DefaultInstance.Show();
    }
}
Run Code Online (Sandbox Code Playgroud)

这仅在VB中用于表单(从System.Windows.Forms.Form继承的类)中发生。就我个人而言,我认为这是VB的可怕“功能”-混淆了类和实例之间的区别。