C#回收機(jī)制之資源回收托管
更新時(shí)間:2022年05月05日 08:43:10 作者:農(nóng)碼一生
這篇文章介紹了C#回收機(jī)制之資源回收托管,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
一、常見(jiàn)非托管資源
- Windows窗口句柄、數(shù)據(jù)庫(kù)鏈接、GDI對(duì)象、獨(dú)占文件鎖等等對(duì)象
- ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor
- FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen
- Regex,Socket,StreamWriter,Timer,Tooltip
二、實(shí)現(xiàn)原理
定義類(lèi)繼承IDisposable接口
public class DisposeTest : IDisposable
{
//實(shí)現(xiàn)IDisposable接口方法
public void Dispose()
{
}
}在類(lèi)中定義資源和方法
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)閉對(duì)象,沒(méi)有完全釋放。Dispose()方法完全釋放了
- 一般情況,Close() 實(shí)現(xiàn)了接口對(duì)Dispose()的封裝,調(diào)用時(shí)不需要直接調(diào)用Dispose()
四、常見(jiàn)封裝的語(yǔ)法寫(xiě)法
Close()方法
SqlConnection conn3 = new SqlConnection();
try
{
conn3.Open();
}
catch (Exception)
{
throw;
}
finally
{
conn3.Close();//關(guān)閉對(duì)象
}using()
using (SqlConnection cnn = new SqlConnection())
{
//此處使用,使用完后系統(tǒng)會(huì)自動(dòng)釋放
}Dispose()
SqlConnection cnn2 = new SqlConnection();
try
{
//這里寫(xiě)要執(zhí)行的代碼
}
finally
{
cnn2.Dispose();
}
到此這篇關(guān)于C#回收機(jī)制之資源回收托管的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#實(shí)現(xiàn)在前端網(wǎng)頁(yè)彈出警告對(duì)話框(alert)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在前端網(wǎng)頁(yè)彈出警告對(duì)話框(alert)的方法,涉及C#通過(guò)自定義函數(shù)調(diào)用window.alert方法彈出對(duì)話框的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
C#中WinForm控件的拖動(dòng)和縮放的實(shí)現(xiàn)代碼
本篇文章主要介紹了C#中WinForm控件的拖動(dòng)和縮放的實(shí)現(xiàn)代碼,C# WinForm控件的拖動(dòng)和縮放是個(gè)很有用的功能,有興趣的可以了解一下。2017-01-01
newtonsoft.json解析天氣數(shù)據(jù)出錯(cuò)解決方法
這篇文章主要介紹了NewtonSoft.JSon解析天氣數(shù)據(jù)時(shí)出錯(cuò)的解決方法,需要的朋友可以參考下2014-02-02

