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

时间:2012-01-19 17:16:35

标签: c# vb.net winforms

有人可以向我解释一下吗?

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

此外,在C#和Form2.Close()中执行相同的操作;不编译。

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

3 个答案:

答案 0 :(得分:6)

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

编译器实际发出了这个:

My.Forms.Form2.Close();

有一个很好的writeup of that feature here

  

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

     

...

     

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:1)

你是对的,当Form2.Close();只是一种类型时,你不能打电话给Form2。但是,VB.NET在幕后创建了一个具有相同名称的属性,因此您实际上是在Close的实例上调用Form2。如果手动创建此类属性,则可以在C#中执行相同操作。它看起来像一个静态方法调用,但它不是。