有人可以向我解释一下吗?
在Visual Studio 2010中,创建一个VB.net Windows窗体应用程序。添加2个表单:Form1和Form2。在Form1 Load事件中键入Form2.Close()。现在,如果我们查看方法定义,Close()不是静态(共享)方法。那么如何在运行时编译或工作呢?
此外,在C#和Form2.Close()中执行相同的操作;不编译。
发生了什么事?为什么在VB.net中可以实现这一点以及执行该行代码时实际发生了什么?
答案 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#中执行相同操作。它看起来像一个静态方法调用,但它不是。