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"); } /*此處:添加功能代碼 * --- * --- */ } }