2011-05-04 112 views
0

據我所知,C#中的析構函數語法(〜ClassName)是一種編寫終結器的方法。在編譯到IL後,此方法變爲Finalize方法。因此,這意味着C#編程語言DOES支持析構函數,但Visual C#作爲.net框架的一部分不允許程序員使用它。Visual C#中沒有析構函數嗎?

編輯:我知道可以使用IDisposable接口來清理非託管資源。問題不在於它。問題是關於Visual C#中的析構函數嗎? 因爲析構函數的語法是編寫終結器=>的方法,所以沒有辦法自己定義析構函數。

+1

所以...問題? – BoltClock 2011-05-04 16:51:11

+0

這是真的嗎? – Sergey 2011-05-04 16:51:30

+0

是的,你不能在你的代碼中使用析構函數。程序明確釋放一個對象時運行析構函數。相比之下,終結器是在內部垃圾收集系統釋放對象時執行的。 – 2011-05-04 16:54:47

回答

4

爲了清理內存,析構函數通常在其他語言(如C++)中是必需的。由於C#是垃圾收集,析構函數僅用於清理不會自動清理的資源。

+0

問題是,Visual C#中是否存在析構函數?因爲據我瞭解你所描述的是終結者 – Sergey 2011-05-04 16:53:09

+1

@Sergey:如果這是問題,也許你應該在原始帖子中提問。 – 2011-05-04 16:54:35

-1

您可以實現IDisposable接口來創建一種析構函數(Dispose()方法)。

+0

爲什麼downvote?我的答案等於Seva Alekseyev的... – Rhapsody 2011-05-05 10:11:59

1

最接近破壞者的是IDisposable接口及其Dispose()方法。使用using(){}構造,您可以使Dispose()調用成爲確定性的,從而完成令人尊敬的RAII模式。

2

我並不十分贊同你的說法:

所以,這意味着C#編程語言 不支持析構函數,但 的Visual C#.NET作爲框架的一部分 不允許程序員使用它。

是的,你可以在C#中編寫一個終結器(析構函數),它允許你在對象被垃圾收集之前清理所需的任何非託管資源。但是,您應該小心地正確實施它(想到處置模式)。

現在,如果你的意思是它支持確定性破壞?不一定,如果您需要確定性地釋放資源,您最好的選擇是IDisposable接口和使用塊。

0

簡單的答案是你可以編寫析構函數來幫助內存管理等,但是你不能明確地調用它們。如果需要,可以實現IDisposable接口並顯式調用Dispose()方法。 Destructor存在供垃圾收集系統使用。它通常會檢查你的對象是否已經處理完畢,然後調用相同的Dispose()方法。

基本上,如果你忘了明確部署和Colletor有垃圾後,你收拾:-)

視覺位真的是無關緊要它的存在。

+0

爲什麼downvote? – kirps 2011-05-04 20:58:59

1

問題是關於在Visual C#中是否存在析構函數?由於析構函數的語法是寫一個終結的方式=>有沒有辦法來定義一個析構函數本身

中最接近的答案很可能是:不,沒有確定性析構函數(如你認識他們例如C++),或者使用C語言編譯的任何語言,或者CLR可以安全執行的任何語言。

0

C#語言的東西叫做「析構函數」,它的語義與C++中的析構函數沒有任何關係。雖然名稱不幸,但「析構函數」是C#語法元素的標準定義術語,它以代字號和類名開頭,並要求編譯器生成一個調用所提供代碼的Finalize()覆蓋,然後調用base.Finalize()。一個相當愚蠢和毫無意義的語言構造(簡單地允許代碼覆蓋Finalize()將不那麼容易混淆;將名稱Finalize()綁定到語言中與GC.KeepAlive()和GC.SuppressFinalize (),這兩個通常在使用析構函數的正確編寫的程序中都需要)。

順便說一句,名稱「析構函數」具有諷刺意味,因爲析構函數實際上並不銷燬對象,而是提供對象,否則這些對象將被銷燬,最後一秒緩存將其事務按順序排列。