如果它不是静态方法,为什么我可以调用Form.Close()

Jon*_*ski 5 c# vb.net winforms

谁可以给我解释一下这个?

在Visual Studio 2010中,创建一个VB.net Windows窗体应用程序.添加2个表单:Form1和Form2.在Form1 Load事件中键入Form2.Close().现在,如果我们查看方法定义,Close()不是静态(共享)方法.那么如何在运行时编译或工作呢?

此外,在C#和Form2.Close()中做同样的事情; 不编译.

这是怎么回事?为什么在VB.net中可以实现这一点以及在执行该行代码时实际发生了什么?

vcs*_*nes 6

您已经发现了一个名为"默认实例"的VB.NET-ism.

编译器实际上是这样发出的:

My.Forms.Form2.Close();
Run Code Online (Sandbox Code Playgroud)

这里有一个很好的特写:

默认实例是VB应用程序框架为您创建和管理的该类型的对象.

...

如果使用默认实例,则无需显式调用构造函数.您只需通过My.Forms对象直接访问默认实例

  • 我喜欢这个功能背后的原因:*VB的主要目标之一就是提供电源,同时让尽可能多的人尽可能简单地编程.默认表单实例的引入是为了促进这一目标.许多OOP新手都使用VB.NET中的对象,但是他们并没有真正理解它们.*引入隐式懒惰实例的单例是多么可爱的理由:很多人对OOP不熟悉,不太了解OOP,所以让我们来介绍一下另一个特殊功能. (3认同)

com*_*ech 5

原因是如果您只是按名称引用它们,VB会创建表单的自动实例,如果没有捕获它,可能会在运行时导致意外后果.

我发现没有任何设置可以防止这种情况发生.

但是,您可以在编译时通过将默认构造函数的范围从Public更改为Friend,或者通过删除默认构造函数并添加需要参数的构造函数来"中断"此行为.这些或这些更改将禁用自动表单引用.