static class CSharp_3 {
/* ----------------------------------------
* 以下學習資源的釋放:IDispose和析構函數
* 1、IDispose
* 2、析構函數
* 一般情況下,最好的方法是實現這兩種機制,獲得這兩種機制的優點,克服其缺點。因此最好是我們實現兩種機制。
* ----------------------------------------
*/
[STAThread]
static void Main() {
//示例如下:
MyResourceClass sampleObject = new MyResourceClass();
//....................
//釋放資源
sampleObject.Dispose();
sampleObject = null;
}
}
/* --------------------------------
* 釋放資源例子:
* 實現兩種機制確保資源能夠釋放
* https://msdn.microsoft.com/zh-cn/library/fs2xkftw(v=vs.110).aspx
* --------------------------------
*/
public class MyResourceClass : IDisposable {
/// <summary>
/// 標記是否已調用Dispose(bool)的變量
/// </summary>
private bool isDisposed = false;
/// <summary>
/// 實現的IDispose接口
/// 由於公共、非虛擬的、無參數 Dispose 方法由該類型的使用者調用,因此其用途是【釋放非托管資源和托管資源】和指示終結器(如果存在)不必運行。 因此,它具有標准實現。
/// </summary>
public void Dispose() {
//釋放非托管資源和托管資源
Dispose(true);
//指示終結器(如果存在)不必運行
GC.SuppressFinalize(this);
}
/*-----------------------------------------
* Dispose(Boolean) 重載:
* 參數: disposing, 是一個 Boolean,它指示方法調用是來自 Dispose 方法(其值為 true)還是來自終結器(其值為 false)。
* 主體包含兩個代碼塊:
* 代碼塊1:釋放非托管資源的塊。 無論 disposing 參數的值如何,都會執行此塊。
* 代碼塊2:釋放托管資源的條件塊。 如果 disposing 的值為 true,則執行此塊。
* ----------------------------------------
*/
protected virtual void Dispose(bool disposing) {
if (!isDisposed) {
if (disposing) {
/*此處【代碼塊2】:釋放所有的托管對象:指被CLR(公共語言運行庫:dotnet運行庫)控制的內存資源,常見的托管資源:
* int,
* string,
* float,
* DateTime等等,
* .net中超過80%的資源都是托管資源。
* ---
* ---
*/
}
}
else {
return;
}
/*此處:【代碼塊1】:釋放所有的非托管對象:指CLR(公共語言運行庫:dotnet運行庫) 不能控制和管理的部分,如文件流,數據庫連接,網絡連接,GDI+,Com對象,系統的窗口句柄,打印機資源等,下面列舉一下常見的非托管類型:
* ApplicationContext,
* Brush,
* Connection,
* Component,
* ComponentDesigner,
* Container,
* Context,
* Cursor,
* Stream,
* FileStream,
* Font,
* Icon,
* Image,
* Matrix,
* Object,
* OdbcDataReader,
* OleDBDataReader,
* Pen,
* Regex,
* Socket,
* StreamWriter,
* StreamReader,
* Timer,
* Tooltip
* --
*/
this.isDisposed = true;
}
/// <summary>
/// 析構函數
/// </summary>
~MyResourceClass() {
//釋放非托管資源
Dispose(false);
}
/// <summary>
/// 功能示例方法
/// </summary>
public void Something() {
//判定資源是否已釋放過
if (this.isDisposed) {
throw new ObjectDisposedException("MyResourceClass");
}
/*此處:添加功能代碼
* ---
* ---
*/
}
}