2016-12-11 116 views
-2

就像在Visual Studio中的默認C#的模板,我已經定義了一個Windows Form作爲一個靜態對象,如下圖所示:我是否需要處理靜態對象內定義的非靜態對象?

public static FormMain formMain; 

static void Main() 
{ 
    formMain = new FormMain(); 
    Application.Run(formMain); 
    formMain.Dispose(); 
} 

正如你所看到的,我分配(使用new)的內存空間這個靜態表單在調用它之前,在表單關閉後釋放內存(使用Dispose)。

然而,這種靜態的形式中,我定義了幾個非靜態物體(比如標籤)的,如下圖所示:

public FormMain() 
{ 
    // some code here 
    Label myLabel1 = new Label(); 
    Label myLabel2 = new Label(); 
    Label myLabel3 = new Label(); 
    // some code here 
} 

現在,我有兩個問題:

  1. 我是否還必須Dispose這些非靜態對象,或者它們是否在調用formMain.Dispose();行後立即釋放(釋放內存)?

  2. 如果我需要處理這些非靜態對象,在哪個階段的程序我應該更喜歡使用Dispose(比如,在FormClosedFormClosing事件)?

注意:我儘量不使用表單設計工具在Visual Studio,但更喜歡通過代碼行表格線。

+1

Application.Run已經在示例中處理了這個表單:「Form類的Dispose方法將在返回[Application.Run]方法之前被調用。」 – user2864740

+0

我不是在詢問窗體,而是在窗體中定義的非靜態對象('myLabel1','myLabel2'等)。 – ssd

+1

'FormMain'應該處理它創建的成員變量。 「FormMain」是否存儲在一個靜態變量中無關緊要。 –

回答

3

就像在Visual Studio中的默認C#的模板,我已經定義了一個Windows窗體作爲一個靜態對象,如下圖所示:

不知道爲什麼你要存儲應用程序主窗口形式作爲一個公共靜態領域。你在想什麼特別的場景?

正如你所看到的,我已經分配給這個靜態形式的存儲空間(使用新)調用之前...

這不是C++。在C#中調用new是強制性的,在涉及引用類型時它不是一個選項。

並在窗體關閉後釋放內存(使用Dispose)。

調用Dispose釋放了沒有管理的記憶力。我建議你閱讀IDisposable模式和託管內存模型,你似乎在這裏有一些誤解。

是否必須處理這些非靜態對象以及它們是否一旦formMain.Dispose()被釋放(釋放內存)行被調用?

靜態或非靜態是無關緊要的,你應該處置所有的一次性物品。閱讀this更多信息

如果我需要處理這些非靜態對象,在哪個階段的程序我應該更喜歡使用的Dispose(比如,在FormClosed或事件的FormClosing)的?

您應該遵循IDisposable模式的準則進行處置。

+0

關於有問題的程序;我有**(1)**一些在方法中定義的標籤(如'FormMain()')和**(2)**在FormMain類的主體中定義的一些其他標籤我在主體中定義它們,因爲我使用它們與其他表單進行交互)。到目前爲止,我推斷,對於在方法中定義的標籤(有一個範圍),我不需要處理它們。另一方面,對於在表單主體中公開定義的標籤,我需要在關閉表單之前處理它們(在FormClosing事件中)。我對嗎? – ssd

+0

@ssd不,不,不。你應該根據'IDisposable'模式處理對象,忘記事件。此外,如果您希望它們具有任何用途,您在方法內創建的標籤可能會被添加到窗體的「控件」集合中,因此即使本地名稱超出範圍,對象仍然可以訪問。我的建議:忘記形式,控制和事件。你需要首先理解基礎知識。閱讀託管內存模型,瞭解它,然後在此基礎上進行構建。在知道如何爬行之前,你似乎試圖找出滑板。 – InBetween

相關問題