?? 自定義類(顯式資源釋放dispose模式-可復(fù)用代碼).txt
字號(hào):
自定義類(顯式資源釋放Dispose模式-可復(fù)用代碼)
///清理資源后,調(diào)用方法會(huì)拋出System.ObjectDisposedException 異常。
/// <summary>
/// 用于封裝托管類型
/// </summary>
public sealed class OSHandle:IDisposable
{
private IntPtr handle;//保存Win32句柄
//構(gòu)造器-初始化句柄
public OSHandle(IntPtr handle)
{
this.handle=handle;
}
//析構(gòu)器-當(dāng)執(zhí)行垃圾收集時(shí)執(zhí)行(Finalize方法)
~OSHandle()
{
Dispose(false);
}
//顯示關(guān)閉非托管資源(C#默認(rèn)公有虛方法為公有密封)
public void Dispose()
{
GC.SuppressFinalize(this);//請(qǐng)求系統(tǒng)(垃圾收集器)不要調(diào)用指定對(duì)象的完成器(Finzlize方法)
Dispose(true);
}
//替換Dispose()方法
public void Close()
{
Dispose();
}
//實(shí)際清理工作
private void Dispose(Boolean disposing)
{
lock(this)//確保線程安全
{
if(disposing)
{
//對(duì)象是在顯式的關(guān)閉,而非終止化,調(diào)用其它字段是安全的。
}
if(IsValid)
{
CloseHandle(handle);
handle=InvalidHandle;//避免多次調(diào)用
}
}
}
public IntPtr InvalidHandle{get{return IntPtr.Zero;}}//返回?zé)o效句柄
public IntPtr ToHandle(){return handle;}//返回句柄
public static implicit operator IntPtr(OSHandle osHandle)//返回句柄
{
return osHandle.ToHandle();
}
public Boolean IsValid{get{return (handle!=InvalidHandle);}}//句柄是否有效
public Boolean IsInvalid{get{return !IsInvalid;}}//句柄是否無(wú)效
[System.Runtime.InteropServices.DllImport("Kernel32")]
private extern static Boolean CloseHandle(IntPtr handle);//Win32函數(shù),釋放非托客資源
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -