簡體   English   中英

如果它不是靜態方法,為什么我可以調用Form.Close()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM