国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

編寫高質(zhì)量代碼改善C#程序的157個建議——建議49:在Dispose模式中應(yīng)提取一個受保護的虛方法

2019-11-14 14:05:43
字體:
供稿:網(wǎng)友

建議49:在Dispose模式中應(yīng)提取一個受保護的虛方法

在標(biāo)準(zhǔn)的Dispose模式中,真正的IDisposable接口的Dispose方法并沒有做實際的清理工作,它其實是調(diào)用了下面的這個帶bool參數(shù)且受保護的的虛方法:

        /// <summary>        /// 非密封類修飾用PRotected virtual        /// 密封類修飾用private        /// </summary>        /// <param name="disposing"></param>        protected virtual void Dispose(bool disposing)        {
      //省略代碼 }

之所以提供這樣一個受保護的虛方法,是因為考慮了這個類型會被其他類型繼承的情況。如果類型存在一個子類,子類也許會實現(xiàn)自己的Dispose模式。受保護的虛方法用來提醒子類:必須在自己的清理方法時注意到父類的清理工作,即子類需要在自己的釋放方法中調(diào)用base.Dispose方法。

    public class DerivedSampleClass : SampleClass    {        //子類的非托管資源        private IntPtr derivedNativeResource = Marshal.AllocHGlobal(100);        //子類的托管資源        private AnotherResource derivedManagedResource = new AnotherResource();        //定義自己的是否釋放的標(biāo)識變量        private bool derivedDisposed = false;        /// <summary>        ///重寫父類Dispose方法        /// </summary>        /// <param name="disposing"></param>        protected override void Dispose(bool disposing)        {            if (derivedDisposed)            {                return;            }            if (disposing)            {                // 清理托管資源                if (derivedManagedResource != null)                {                    derivedManagedResource.Dispose();                    derivedManagedResource = null;                }            }            // 清理非托管資源            if (derivedNativeResource != IntPtr.Zero)            {                Marshal.FreeHGlobal(derivedNativeResource);                derivedNativeResource = IntPtr.Zero;            }            //調(diào)用父類的清理代碼            base.Dispose(disposing);            //讓類型知道自己已經(jīng)被釋放            derivedDisposed = true;        }    }    public class SampleClass : IDisposable    {        //演示創(chuàng)建一個非托管資源        private IntPtr nativeResource = Marshal.AllocHGlobal(100);        //演示創(chuàng)建一個托管資源        private AnotherResource managedResource = new AnotherResource();        private bool disposed = false;        /// <summary>        /// 實現(xiàn)IDisposable中的Dispose方法        /// </summary>        public void Dispose()        {            //必須為true            Dispose(true);            //通知垃圾回收機制不再調(diào)用終結(jié)器(析構(gòu)器)            GC.SuppressFinalize(this);        }        /// <summary>        /// 不是必要的,提供一個Close方法僅僅是為了更符合其他語言(如        /// C++)的規(guī)范        /// </summary>        public void Close()        {            Dispose();        }        /// <summary>        /// 必須,防止程序員忘記了顯式調(diào)用Dispose方法        /// </summary>        ~SampleClass()        {            //必須為false            Dispose(false);        }        /// <summary>        /// 非密封類修飾用protected virtual        /// 密封類修飾用private        /// </summary>        /// <param name="disposing"></param>        protected virtual void Dispose(bool disposing)        {            if (disposed)            {                return;            }            if (disposing)            {                // 清理托管資源                if (managedResource != null)                {                    managedResource.Dispose();                    managedResource = null;                }            }            // 清理非托管資源            if (nativeResource != IntPtr.Zero)            {                Marshal.FreeHGlobal(nativeResource);                nativeResource = IntPtr.Zero;            }            //讓類型知道自己已經(jīng)被釋放            disposed = true;        }        public void SamplePublicMethod()        {            if (disposed)            {                throw new ObjectDisposedException("SampleClass", "SampleClass is disposed");            }            //省略        }    }    class AnotherResource : IDisposable    {        public void Dispose()        {        }    }


如果不為類提供這個受保護的虛方法,很有可能讓開發(fā)者設(shè)計子類的時候忽略掉父類的清理工作。所以要在類型的Dispose模式中提供一個受保護的虛方法。

 

 

轉(zhuǎn)自:《編寫高質(zhì)量代碼改善C#程序的157個建議》陸敏技


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 荃湾区| 略阳县| 昆山市| 汉阴县| 赤城县| 大同县| 台江县| 新宾| 凌云县| 望江县| 涟水县| 渭源县| 依兰县| 德令哈市| 深圳市| 盈江县| 日土县| 泰宁县| 盖州市| 太谷县| 麟游县| 安福县| 柏乡县| 全州县| 福海县| 海盐县| 武隆县| 鄂尔多斯市| 台南县| 蒙城县| 虞城县| 海丰县| 射洪县| 海南省| 诏安县| 惠安县| 凤城市| 青龙| 尉犁县| 常州市| 定结县|