Finalize和Dispose與析構的區別

2021-04-02 01:16:03 字數 952 閱讀 6882

在clr中記憶體管理的真正工作是由idisposable介面的dispose()方法和類的析構函式完成的。當有非託管資源需要釋放的時候,通常應該執行finalize()方法來代替析構函式。

idisposable是乙個介面,它並不侷限在c#中,它是microsoft的com技術的一部分,它提供的乙個用於清理不僅僅是c#內的各種型別的元件的通用機制.類似與idisposable的介面使得c#適用於.net框架。idisposable定義了乙個專門的方法,dispose().

在類中如果有必須被釋放的資源,最好的解決方案就是同時使用析構函式和dispose()方法。

首先看一下clr中自動**的效果:

using system;

using system.text;

class dr)",this.ci);}}

class da : idisposable 

public void dispose())",this.n);

gc.suppressfinalize(this);

}~da())",this.n);}}

class demo

可以看出clr裡記憶體管理系統自動按變數進棧的順序來消除變數。

如果我改一下:

using system;

using system.text;

class dr)",this.ci);}}

class da : idisposable 

public void dispose())",this.n);

gc.suppressfinalize(this);

}~da())",this.n);}}

class demo

d2.dispose();

}

現在可以看出using塊中的d3是自動釋放的,而且也是最先被釋放的,所以在在寫程式的時候,多用using塊是有好處的,呵呵

IDispose和Finalize的區別和聯絡

產生了兩個問題 中紅色標註區域 問題1 為什麼在析構函式中呼叫的是 dispose false 也就是為什麼gc垃圾 機制在 對 象的時候只 或者釋放非託管資源,而不 託管資源?問題2 在 dispose 中 gc.suppressfinalize this 是什麼意思?上網搜了寫資料,終於了解了這...

Finalize和Dispose的區別

兩者都是為了釋放非託管資源,如io控制代碼 資料庫連線等。finalize 基類object定義了受保護的方法finalize,垃圾 器判定物件是垃圾後,會呼叫物件的finalize方法 注意 重寫的都會呼叫 定義 在類名前新增 如 classname finalize由gc隱式呼叫,它在垃圾物件 ...

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

如果我們在類中沒有定義析構函式,則 clr不會自動給這個類新增乙個析構函式。如下 using system using system.collections.generic using system.text namespace ownfinalize 轉換成il 語言如下 class privat...