<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        .net非托管資源的回收方法

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:38:46
        文檔

        .net非托管資源的回收方法

        .net非托管資源的回收方法:本文實(shí)例講述了.net非托管資源的回收方法,分享給大家供大家參考。具體分析如下: 釋放未托管的資源有兩種方法 1、析構(gòu)函數(shù) 2、實(shí)現(xiàn)System.IDisposable接口 一、析構(gòu)函數(shù) 構(gòu)造函數(shù)可以指定必須在創(chuàng)建類的實(shí)例時(shí)進(jìn)行的某些操作,在垃圾收集器刪除對(duì)象時(shí),也
        推薦度:
        導(dǎo)讀.net非托管資源的回收方法:本文實(shí)例講述了.net非托管資源的回收方法,分享給大家供大家參考。具體分析如下: 釋放未托管的資源有兩種方法 1、析構(gòu)函數(shù) 2、實(shí)現(xiàn)System.IDisposable接口 一、析構(gòu)函數(shù) 構(gòu)造函數(shù)可以指定必須在創(chuàng)建類的實(shí)例時(shí)進(jìn)行的某些操作,在垃圾收集器刪除對(duì)象時(shí),也

        本文實(shí)例講述了.net非托管資源的回收方法,分享給大家供大家參考。具體分析如下:

        釋放未托管的資源有兩種方法
         
        1、析構(gòu)函數(shù)

        2、實(shí)現(xiàn)System.IDisposable接口
         
        一、析構(gòu)函數(shù) 
        構(gòu)造函數(shù)可以指定必須在創(chuàng)建類的實(shí)例時(shí)進(jìn)行的某些操作,在垃圾收集器刪除對(duì)象時(shí),也可以調(diào)用析構(gòu)函數(shù)。析構(gòu)函數(shù)初看起來似乎是放置釋放未托管資源、執(zhí)行一般清理操作的代碼的最佳地方。但是,事情并不是如此簡(jiǎn)單。由于垃圾回收器的運(yùn)行規(guī)則決定了,不能在析構(gòu)函數(shù)中放置需要在某一時(shí)刻運(yùn)行的代碼,如果對(duì)象占用了寶貴而重要的資源,應(yīng)盡可能快地釋放這些資源,此時(shí)就不能等待垃圾收集器來釋放了. 
        實(shí)例

        代碼如下:using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        namespace MemRelease
        {
            class Program
            {
                ~Program()
                {
                    // Orders.
                }
                static void Main(string[] args)
                {
                }
            }
        }
         
        在IL DASM中,你會(huì)發(fā)現(xiàn)并沒有這個(gè)析構(gòu)的方法。C#編譯器在編譯析構(gòu)函數(shù)時(shí),會(huì)隱式地把析構(gòu)函數(shù)的代碼編譯為Finalize()方法的對(duì)應(yīng)代碼,確保執(zhí)行父類的Finalize()方法 看下這段代碼中對(duì)于析構(gòu)函數(shù)的編譯:

        代碼如下:.method family hidebysig virtual instance void
                Finalize() cil managed
        {
          // Code size       14 (0xe)
          .maxstack  1
          .try
          {
            IL_0000:  nop
            IL_0001:  nop
            IL_0002:  leave.s    IL_000c
          }  // end .try
          finally
          {
            IL_0004:  ldarg.0
            IL_0005:  call       instance void [mscorlib]System.Object::Finalize()
            IL_000a:  nop
            IL_000b:  endfinally
          }  // end handler
          IL_000c:  nop
          IL_000d:  ret
        } // end of method Program::Finalize
         
        使用析構(gòu)函數(shù)來釋放資源有幾個(gè)問題:
         
        1、與C++析構(gòu)函數(shù)相比,C#析構(gòu)函數(shù)的問題是他們的不確定性。在刪除C++對(duì)象時(shí),其析構(gòu)函數(shù)會(huì)立即執(zhí)行,但是由于垃圾收集器的工作方式,無法確定C#對(duì)象的析構(gòu)函數(shù)何時(shí)執(zhí)行。
        2、C#析構(gòu)函數(shù)的執(zhí)行會(huì)延遲對(duì)象最終從內(nèi)存中刪除的時(shí)間。有析構(gòu)函數(shù)的對(duì)象需要2次處理才能刪除:第一次調(diào)用析構(gòu)函數(shù)時(shí),沒有刪除對(duì)象,第二次調(diào)用才真正刪除對(duì)象。
         
        二、IDisposable接口

        IDisposable接口定義了一個(gè)模式,為釋放未托管的資源提供了確定的機(jī)制,并避免產(chǎn)生析構(gòu)函數(shù)固有的與垃圾函數(shù)器相關(guān)的問題。IDisposable接口聲明了一個(gè)方法Dispose(),它不帶參數(shù),返回void。
         
        1、MSDN建議按照下面的模式實(shí)現(xiàn)IDisposable接口
         

        代碼如下:

        public class Foo: IDisposable
         {
             public void Dispose()
             {
                Dispose(true);
                GC.SuppressFinalize(this);
             }
             protected virtual void Dispose(bool disposing)
             {
                if (!m_disposed)
                {
                    if (disposing)
                    {
                       // Release managed resources
                    }
                    // Release unmanaged resources
                    m_disposed = true;
                }
             }
             ~Foo()
             {
                Dispose(false);
             }
             private bool m_disposed;
         }
         
        在.NET的對(duì)象中實(shí)際上有兩個(gè)用于釋放資源的函數(shù):Dispose和Finalize
         
        (1)、Finalize的目的是用于釋放非托管的資源,而Dispose是用于釋放所有資源,包括托管的和非托管的
         
        (2)、void Dispose(bool disposing)函數(shù)通過一個(gè)disposing參數(shù)來區(qū)別當(dāng)前是否是被Dispose()調(diào)用
        如果是被Dispose()調(diào)用,那么需要同時(shí)釋放托管和非托管的資源。如果是被~Foo()(也就是C#的Finalize())調(diào)用了,那么只需要釋放非托管的資源即可。
         
        (3)、Dispose()函數(shù)是被其它代碼顯式調(diào)用并要求釋放資源的,而Finalize是被GC調(diào)用的
        在GC調(diào)用的時(shí)候Foo所引用的其它托管對(duì)象可能還不需要被銷毀,并且即使要銷毀,也會(huì)由GC來調(diào)用。因此在Finalize中只需要釋放非托管資源即可。另外一方面,由于在Dispose()中已經(jīng)釋放了托管和非托管的資源,因此在對(duì)象被GC回收時(shí)再次調(diào)用Finalize是沒有必要的,所以在Dispose()中調(diào)用GC.SuppressFinalize(this)避免重復(fù)調(diào)用Finalize。
         
        然而,即使重復(fù)調(diào)用Finalize和Dispose也是不存在問題的,因?yàn)橛凶兞縨_disposed的存在,資源只會(huì)被釋放一次,多余的調(diào)用會(huì)被忽略過去。
         
        Finalize、Dispose保證了:
         
        (1)、 Finalize只釋放非托管資源;
        (2)、 Dispose釋放托管和非托管資源;
        (3)、 重復(fù)調(diào)用Finalize和Dispose是沒有問題的;
        (4)、 Finalize和Dispose共享相同的資源釋放策略,因此他們之間也是沒有沖突的。
         
        2、IDisposable例子

        代碼如下:namespace 資源回收
        {
            class Program
            {
                static void Main(string[] args)
                {
                    //使用using對(duì)實(shí)現(xiàn)IDisposable的類了進(jìn)行資源管理
        /*拿到一個(gè)對(duì)象的時(shí)候,首先判斷這個(gè)對(duì)象是否實(shí)現(xiàn)了IDisposable接口,如果實(shí)現(xiàn)了,最好就用using包裹住這個(gè)對(duì)象,保證這個(gè)對(duì)象用完之后被釋放掉,否則很可能出現(xiàn)資源泄露的問題
        */
                    using (Telphone t1 = new Telphone())
                    {
                        t1.Open();
                        t1.Speak("hello");
                        t1.Bomb();
                        //t1.Dispose();//如果在這里調(diào)用了Dispose()方法釋放資源,那么在執(zhí)行t1.Open()方法就出錯(cuò),電話線已經(jīng)被剪斷了,無法再打電話了
                        t1.Open();
                        t1.Speak("I am back!");
                    }//代碼執(zhí)行到這里后,就會(huì)調(diào)用Dispose方法來進(jìn)行資源回收
                    Console.ReadKey();
                }
            }
            /// <summary>
            /// Telphone類實(shí)現(xiàn)了IDisposable接口
            /// </summary>
            class Telphone : IDisposable
            {
                /// <summary>
                /// 電話狀態(tài)
                /// </summary>
                private TelphoneState state;
                /// <summary>
                /// 打電話
                /// </summary>
                public void Open()
                {
                    if (state == TelphoneState.Disposed)
                    {
                        throw new Exception("電話線已經(jīng)被剪斷,無法打開!");
                    }
                    state = TelphoneState.Open;
                    Console.WriteLine("拿起電話");
                }
                /// <summary>
                /// 說話
                /// </summary>
                /// <param name="s">說話內(nèi)容</param>
                public void Speak(string s)
                {
                    if (state != TelphoneState.Open)
                    {
                        throw new Exception("沒有連接");
                    }
                    Console.WriteLine(s);
                }
                /// <summary>
                /// 掛掉電話
                /// </summary>
                public void Bomb()
                {
                    state = TelphoneState.Close;
                    Console.WriteLine("掛掉電話");
                }
                IDisposable 成員
            }
            /// <summary>
            /// 電話狀態(tài)枚舉
            /// </summary>
            enum TelphoneState
            {
                Open, Close, Disposed
            }
        }
         
        程序運(yùn)行結(jié)果如下圖所示:
         
         
         
        三、析構(gòu)函數(shù)和IDisposable混合調(diào)用的例子

        代碼如下:public class ResourceHolder : IDisposable
        {
              private bool isDispose = false;
              // 顯示調(diào)用的Dispose方法
          public void Dispose()
              {
                   Dispose(true);
                  GC.SuppressFinalize(this);
               }
               // 實(shí)際的清除方法
          protected virtual void Dispose(bool disposing)
              {
                    if (!isDisposed)
                   {
                      if (disposing)
                   {
                              // 這里執(zhí)行清除托管對(duì)象的操作.
                          }
                          // 這里執(zhí)行清除非托管對(duì)象的操作
                    }
                 isDisposed=true;
              }
              // 析構(gòu)函數(shù)
              ~ResourceHolder()
              {
                    Dispose (false);
              }
        }

        希望本文所述對(duì)大家的asp.net程序設(shè)計(jì)有所幫助。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        .net非托管資源的回收方法

        .net非托管資源的回收方法:本文實(shí)例講述了.net非托管資源的回收方法,分享給大家供大家參考。具體分析如下: 釋放未托管的資源有兩種方法 1、析構(gòu)函數(shù) 2、實(shí)現(xiàn)System.IDisposable接口 一、析構(gòu)函數(shù) 構(gòu)造函數(shù)可以指定必須在創(chuàng)建類的實(shí)例時(shí)進(jìn)行的某些操作,在垃圾收集器刪除對(duì)象時(shí),也
        推薦度:
        標(biāo)簽: 資源 方法 托管
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲av之男人的天堂网站| 亚洲色欲久久久久综合网| 久久青青草原亚洲av无码app| kk4kk免费视频毛片| 亚洲成av人片在线观看天堂无码| 99久久99久久精品免费观看 | 亚洲成在人线aⅴ免费毛片| 免费观看成人毛片a片2008| 亚洲av永久无码精品天堂久久| 亚洲性线免费观看视频成熟| 亚洲卡一卡二卡乱码新区| 在线免费观看a级片| 亚洲成AV人片在WWW| mm1313亚洲精品国产| 一级毛片一级毛片免费毛片| 国产精品亚洲精品日韩已满| 未满十八18禁止免费无码网站 | 亚洲色无码专区一区| 日韩免费视频在线观看| 成人免费网站久久久| 一本色道久久综合亚洲精品高清| 你懂得的在线观看免费视频| 久久久影院亚洲精品| 丁香花免费高清视频完整版| 亚洲youwu永久无码精品 | 亚洲黄网在线观看| 成人免费毛片内射美女APP| 粉色视频免费入口| 国产亚洲av片在线观看播放 | 亚洲AV无码一区二区乱孑伦AS | 182tv免费视视频线路一二三| 亚洲视频无码高清在线| 亚洲免费日韩无码系列| 青青草无码免费一二三区| 亚洲精品久久无码av片俺去也| 亚洲国模精品一区| 精品香蕉在线观看免费| 免费人人潮人人爽一区二区| 亚洲精品免费在线观看| 拔擦拔擦8x华人免费久久| 久久久精品免费国产四虎|