2013-01-09 69 views
3

在C#中,我必須要總是一旦我完成它就銷燬一個對象嗎?如果沒有,我必須在什麼條件下銷燬對象並調用析構函數?如果我不摧毀物體會發生什麼?優缺點都有什麼?我完成後是否必須摧毀一個物體?

簡單的例子:

Help h = new Help(); 

h.program_name = "myprogram.exe"; 
h.release_date = "01/10/2013"; 
h.version_number = "1.2.0.0"; 

if (args.Length > 0) 
{ 
    if ((args[0] == "-help") || (args[0] == "-version")||(args[0] == "/?")) 
    { 
     h.writeline(); 
    } 
} 
+5

這是一個什麼樣的例子? – Rotem

回答

11

除非對象實現了IDisposable接口,就沒有必要當你用它做了,你用它做任何事情。

讓垃圾收集者做好自己的工作,一切都會在世界上順利。

5

只有處理非託管資源的對象需要明確處置。這些類型應該實現IDisposable接口。對付這些對象的一個​​好方法是使用using關鍵字:

using (SqlConnection conn = new SqlConnection(...)) 
{ 
    // ...do stuff with conn 
} // conn.Dispose() will automatically be called here 
+0

如何知道我是否有「處理非託管內存的對象」 –

+3

@JohnRyann最大的線索是當他們實現IDisposable時。 – asawyer

+0

對於MS的API,您將在該類的語法中看到此聲明。看看[http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsite.aspx](SPSite)例如,你會看到'公共類SPSite:IDisposable'。 –

2

一般C#中使用垃圾收集,所以無需手動「破壞」的對象。

在某些情況下,您可能需要立即釋放與某些對象相關的資源,例如網絡/數據庫連接,打開的文件等。使用'using'通常是最好的方法。

0

在C#中,你不需要破壞總是,但只有在需要時。 通常當你設計一個課程時,你將聲明和實現一個接口,如果需要的話可以進行實際的清理。您需要需要負責照顧您的類實例可能分配的可能非託管資源,並且重載的Dispose()方法是您應該照顧並釋放它們的最佳位置。

要小心,Dispose()方法應該designes,以便它可以被多次調用沒有崩潰,所以要密切關注和核對空值的任何obect參考。這是遍及你的代碼的一個好習慣,但Dispose()方法需要更多的關注。

0

如前所述,在C#中有GC來清理對象。

C#中沒有析構函數,但有finalizer在收集對象時被調用。但是在大多數情況下不需要實現終結器。

約定案方法的一些信息:http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx

如果我們需要對物體配置特定行爲(例如清理非託管資源),你應該實現Finalize方法。

這是你的方式如何能做到這一點: http://msdn.microsoft.com/en-us/library/vstudio/b1yfkh5e(v=vs.100).aspx

當心實現最終確定,它會導致double work爲GC清理這個對象。

+0

在C#中有**析構函數:http://msdn.microsoft.com/en-us/library/66x5fx1b%28v=vs.80%29.aspx –

+0

對不起,我犯了一個術語錯誤。 –

相關問題