C# 中 Finalize 和 Dispose 的區別是什麼?
Finalize
Finalize() 方法由垃圾回收器在回收可被回收的物件之前呼叫。垃圾回收器將負責為未引用的物件釋放記憶體。垃圾回收器在記憶體中不再存在對該物件的有效引用後,會在某個時間點呼叫此方法。
框架不保證何時會發生這種情況,我們可以強制進行垃圾回收,但這會損害程式的效能。Finalize() 屬於 Object 類,它將由執行時呼叫。
示例
using System;
namespace DemoApplication{
public class Demo{
~Demo(){
Console.WriteLine("Finalize called");
}
}
}Dispose
有一些資源(如 Windows 控制代碼、資料庫連線、網路連線、檔案等)無法由垃圾回收器回收。如果我們想要顯式釋放一些特定的物件,那麼實現 IDisposable 並重寫 IDisposable 介面的 Dispose() 方法是最佳實踐。
Dispose() 方法不會自動呼叫,我們必須在客戶端應用程式中顯式呼叫它,當不再需要某個物件時。即使其他對該物件的引用仍然存在,也可以呼叫 Dispose()。
示例
using System;
namespace DemoApplication{
public class Demo : IDisposable{
private bool disposed = false;
public void Dispose(){
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing){
if (!disposed){
if (disposing){
//clean up managed objects
}
//clean up unmanaged objects
disposed = true;
}
}
}
}Microsoft 建議我們在處理非託管資源時同時實現 Dispose 和 Finalize。即使開發人員忽略了顯式呼叫 Dispose 方法,Finalize 實現也會執行,並且在物件被垃圾回收時資源仍然會被釋放。
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP