[英]Why can I call Form.Close() if it's not a static method
誰可以給我解釋一下這個?
在Visual Studio 2010中,創建一個VB.net Windows窗體應用程序。 添加2個表單:Form1和Form2。 在Form1 Load事件中鍵入Form2.Close()。 現在,如果我們查看方法定義,Close()不是靜態(共享)方法。 那么如何在運行時編譯或工作呢?
此外,在C#和Form2.Close()中做同樣的事情; 不編譯。
這是怎么回事? 為什么在VB.net中可以實現這一點以及在執行該行代碼時實際發生了什么?
您已經發現了一個名為“默認實例”的VB.NET-ism。
編譯器實際發出這樣的:
My.Forms.Form2.Close();
這里有一個很好的特寫 :
默認實例是VB應用程序框架為您創建和管理的該類型的對象。
...
如果使用默認實例,則無需顯式調用構造函數。 您只需通過My.Forms對象直接訪問默認實例
原因是如果您只是按名稱引用它們,VB會創建表單的自動實例,如果沒有捕獲它,可能會在運行時導致意外后果。
我發現沒有任何設置可以防止這種情況發生。
但是,您可以通過將默認構造函數的范圍從Public更改為Friend,或者通過刪除默認構造函數並添加需要參數的構造函數來在編譯時“中斷”此行為。 這些或這些更改將禁用自動表單引用。
你是對的,你不能調用Form2.Close();
當Form2
只是一個類類型。 但是,VB.NET在幕后創建了一個具有相同名稱的屬性,因此您實際上是在Form2
的實例上調用Close
。 如果手動創建此類屬性,則可以在C#中執行相同操作。 它看起來像一個靜態方法調用,但事實並非如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.