析構函式和Finalize 之間的那點事

2021-04-21 20:24:12 字數 2584 閱讀 3041

如果我們在類中沒有定義析構函式,則

clr不會自動給這個類新增乙個析構函式。**如下:

using system;

using system.collections.generic;

using system.text;

namespace ownfinalize}}

轉換成il

語言如下:

.class

private

auto ansi beforefieldinit

testownfinalize

extends

[mscorlib

]system.object

.method

private

hidebysig

static

void

main

(string

args)

cil managed

}從上面的

il語言中只看到了

clr自動生成的建構函式,沒有看到自動生成析構函式,即沒看到自動生成

finalize()

方法。

接著往下看:

我們自己在類中定義乙個

finalize()

,簽名如下:

protected virtual void finalize(){}

編譯的時候,編譯器會提乙個警告:自己寫的

finalize()

方法會干擾析構函式的工作,但並沒有報錯。

在自己寫的這個

finalize()

方法中,我並沒有

try{}finally{},

沒有呼叫父類的

finalize(),

這樣的話,實際上會把析構的鏈給打斷了。而且這個方法不管是不是

vitual

的,都會有這種效果。

接著往下看:

如果我們定義這個

finalize()

,並且是

override

基類即object

類的該方法時,編譯器就按捺不住了,提示一條錯誤資訊:

do not override object.finalize. instead, provide a destructor.        

提示不要重寫

object

的finalize

方法,而是提供析構函式的方式。即

object

類的finalize

方法是不能被

override的。

接著往下看:

我們把**寫成下面這樣,又會怎麼樣呢?

using system;

using system.collections.generic;

using system.text;

namespace ownfinalize

protected virtual void finalize()

}class testoverridefinalize: testownfinalize }

}我們在父類testownfinalize中寫了乙個

vitual

的finalize()

方法,這次是

vitual

的,而不是

override

基類即object

類的finalize()

方法,在子類testoverridefinalize中

override

父類testownfinalize的

finalize()

方法,這次編譯器沒有發火,只是警告了一下,還是警告自己寫

finalize

方法會干擾析構函式的執行,不管了,誰讓你不是錯誤而只是個警告。

接著往下看:

如果我們在乙個類中即定義了析構函式,又手寫了

finalize

方法,那結果又會怎麼樣呢?

using system;

using system.collections.generic;

using system.text;

namespace ownfinalize

~testownfinalize()

protected virtual void finalize()}}

這次,編譯器還是很嚴格,發現已經有了乙個finalize方法(

vitual

不vitual

沒關係),析構函式會自己再隱式的轉換乙個,乙個類就有兩個方法簽名是一樣的了,於是直接報錯了,報的錯也是說已經有乙個

finalize

方法、分不清了,如下: 1

)type 'ownfinalize.testownfinalize' already defines a member called 'finalize' with the same 2

)the call is ambiguous between the following methods or properties: 'ownfinalize.testownfinalize.~testownfinalize()' and 'ownfinalize.testownfinalize.finalize()'

Finalize和Dispose與析構的區別

在clr中記憶體管理的真正工作是由idisposable介面的dispose 方法和類的析構函式完成的。當有非託管資源需要釋放的時候,通常應該執行finalize 方法來代替析構函式。idisposable是乙個介面,它並不侷限在c 中,它是microsoft的com技術的一部分,它提供的乙個用於清...

C 析構函式和虛析構函式。

析構函式如果不是虛的話,基類的析構函式將不會被呼叫。多型時,也就是派生類被基類指標所指,或者被基類別名 虛析構函式,被呼叫時,其自身的析構函式和基類的析構函式都將會被呼叫。非虛的時候,不進行多型,只有基類的會被呼叫。純虛析構函式 定義的時候除了加 0 還需要給出函式的實現。因為當遞迴的呼叫析構函式時...

虛析構函式和protected析構函式

型別需要虛析構函式的另外乙個特徵 是該型別具有指標成員或引用成員。如果有指標成員和引用成員,則該型別通常需要實現析構函式以及拷貝操作。通常,乙個實現了析構函式的型別同時也需要實現拷貝建構函式與拷貝複製函式。1.如果乙個類有虛函式功能,它經常作為乙個基類使用。2.如果它是乙個基類,它的派生類經常使用n...