C#回收機制之資源回收托管
更新時間:2022年05月05日 08:43:10 作者:農碼一生
這篇文章介紹了C#回收機制之資源回收托管,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
一、常見非托管資源
- Windows窗口句柄、數(shù)據(jù)庫鏈接、GDI對象、獨占文件鎖等等對象
- ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor
- FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen
- Regex,Socket,StreamWriter,Timer,Tooltip
二、實現(xiàn)原理
定義類繼承IDisposable
接口
public class DisposeTest : IDisposable { //實現(xiàn)IDisposable接口方法 public void Dispose() { } }
在類中定義資源和方法
public class DisposeTest : IDisposable { #region Dispose經(jīng)典實現(xiàn)方式 //實現(xiàn)IDisposable接口方法 public void Dispose() { Dispose(true);//調用處理方法 GC.SuppressFinalize(this);//讓GC忽略 } //資源 private readonly IntPtr unmanagedResource;//非托管內存 private readonly SafeHandle managedResource;//托管資源 //構造方法初始化資源 public DisposeTest() { unmanagedResource = Marshal.AllocHGlobal(sizeof(int));//分配非托管內存 managedResource = new SafeFileHandle(new IntPtr(), true);//創(chuàng)建托管資源 } //根據(jù)不同資源進行處理 protected virtual void Dispose(bool isManualDisposing) { ReleaseUnmanagedResourse(unmanagedResource);//處理非托管資源 if (isManualDisposing) { ReleaseManagedResources(managedResource);//處理托管資源 } } private void ReleaseUnmanagedResourse(IntPtr intPtr) { Marshal.FreeHGlobal(intPtr); //釋放非托管內存 } private void ReleaseManagedResources(SafeHandle safeHandle) { if (safeHandle != null) { safeHandle.Dispose(); //釋放托管資源 } } //析構函數(shù)處理托管資源 ~DisposeTest() { Dispose(false); } #endregion }
三、Close()和Dispose()區(qū)別
- lose()方法關閉對象,沒有完全釋放。Dispose()方法完全釋放了
- 一般情況,Close() 實現(xiàn)了接口對Dispose()的封裝,調用時不需要直接調用Dispose()
四、常見封裝的語法寫法
Close()方法
SqlConnection conn3 = new SqlConnection(); try { conn3.Open(); } catch (Exception) { throw; } finally { conn3.Close();//關閉對象 }
using()
using (SqlConnection cnn = new SqlConnection()) { //此處使用,使用完后系統(tǒng)會自動釋放 }
Dispose()
SqlConnection cnn2 = new SqlConnection(); try { //這里寫要執(zhí)行的代碼 } finally { cnn2.Dispose(); }
到此這篇關于C#回收機制之資源回收托管的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C#實現(xiàn)在前端網(wǎng)頁彈出警告對話框(alert)的方法
這篇文章主要介紹了C#實現(xiàn)在前端網(wǎng)頁彈出警告對話框(alert)的方法,涉及C#通過自定義函數(shù)調用window.alert方法彈出對話框的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04newtonsoft.json解析天氣數(shù)據(jù)出錯解決方法
這篇文章主要介紹了NewtonSoft.JSon解析天氣數(shù)據(jù)時出錯的解決方法,需要的朋友可以參考下2014-02-02