C# 釋放資源的規范寫法


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM