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