• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    .Net 垃圾回收機制詳細介紹

    來源:懂視網 責編:小采 時間:2020-11-27 22:36:26
    文檔

    .Net 垃圾回收機制詳細介紹

    .Net 垃圾回收機制詳細介紹:析構函數 析構函數不能有修飾符,如public。不能接受任何參數。 編譯器自動將一個析構函數轉換成對Object.Finalize方法的一個override版,如下。 class Test { protected override void Finalize() { try {…} finally
    推薦度:
    導讀.Net 垃圾回收機制詳細介紹:析構函數 析構函數不能有修飾符,如public。不能接受任何參數。 編譯器自動將一個析構函數轉換成對Object.Finalize方法的一個override版,如下。 class Test { protected override void Finalize() { try {…} finally

    析構函數

    析構函數不能有修飾符,如public。不能接受任何參數。

    編譯器自動將一個析構函數轉換成對Object.Finalize方法的一個override版,如下。

    class Test
    {
     protected override void Finalize()
     {
     try {…}
     finally { base.Finalize(); }
     }
    }

    垃圾回收器

    .NET垃圾回收器會保證:

    l  每個對象都會被摧毀,它的析構函數一定會被運行。當一個程序結束后,所有對象都會被銷毀。
    l  每個對象只被銷毀一次。
    l  每個對象只有在不可抵達時(即不存在到該對象的引用時)才會被銷毀。

    工作方式:

    1)         它構造包含所有可抵達對象的一個map。為此,它會反復跟隨對象中的引用字段。垃圾回收器會非常小心地構造這個map,并確保循環引用不會無限遞歸。這個map中任意對象都不會被認為不可抵達。
    2)         它檢查是否有任何不可抵達的對象具有一個需要運行的析構函數(運行析構函數的過程稱為finalization)。需要finalization的任何不可抵達的對象都會放到一個特殊的隊列中。這個隊列稱為freachable隊列。
    3)         它回收剩余的不可抵達的對象(即不需要finalization的對象)。為此,它會在heap中向下移動可抵達的對象,從而對heap進行碎片整理,并釋放位于heap頂部的內存。當垃圾回收器移動一個可抵達的對象時,還會更新對該對象的引用。
    4)         然后,它允許其他線程恢復執行
    5)         它在一個單獨的線程中,對需要finalization的不可抵達的對象(位于freachable隊列中)執行finalize操作。 

    有上面的總結可以看出,析構函數的存在會使上面的過程多執行2,5兩步。所以考慮使用using塊來代替泛型。如果所使用的一個類實現了Dispose方法(Close方法)。最好是在finally中調用這個方法(調用方法前需檢查這個要被dispose的對象的disposed屬性是否為false,只有在不為true時再dispose,這也是推薦使用using的原因,using很容易約束這個待析構的變量的作用域-即一對大括號之間)。或者使用using塊將使用這個類的代碼包圍。放入using塊的對象的類型必須實現IDisposable接口。

    標準清理模式

    最后給出一個.NET推薦使用的標準清理模式代碼,示例代碼:

    class MyClass : IDisposable
    {
     private bool disposed = false;//Disposal 狀態
    
     public void Dispose()//公有Dispose方法(可選實現IDisposal接口)
     {
     Dispose(true);
     GC.SuppressFinalize(this);
     }
    
     ~MyClass()
     {
     Dispose(false);
     }
    
     protected virtual void Dispose(bool disposing)
     {
     if (!disposed)
     {
     if (disposing)
     {
     //Dispose the managed resources.
     }
     //Dispose the unmanaged resources.
     }
     disposed = true;
     }
    }

    上述代碼中,我們從析構函數中調用Dispose方法,這樣可以確保Dispose執行。,另外GC.SuppressFinalize(this);用于阻止編譯器在這個對象上執行析構。

    感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    .Net 垃圾回收機制詳細介紹

    .Net 垃圾回收機制詳細介紹:析構函數 析構函數不能有修飾符,如public。不能接受任何參數。 編譯器自動將一個析構函數轉換成對Object.Finalize方法的一個override版,如下。 class Test { protected override void Finalize() { try {…} finally
    推薦度:
    標簽: 介紹 net 機制
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 青草青草久热精品视频在线网站 | 亚洲处破女AV日韩精品| 久久99国产精品久久| 完整观看高清秒播国内外精品资源| 国产日韩精品在线| 日韩精品久久无码人妻中文字幕| 欧美精品一区二区三区免费| 日本精品久久久久中文字幕| 国产精品人人爽人人做我的可爱 | 精品亚洲成AV人在线观看| 欧美精品一区二区三区免费观看 | 国产精品亚洲日韩欧美色窝窝色欲 | 亚洲AV无码久久精品蜜桃| 久久精品成人欧美大片| 香蕉国产精品频视| 国产伦精品一区二区三区女 | 999国内精品永久免费视频| 乱精品一区字幕二区| 在线精品亚洲一区二区小说| 青青青青久久精品国产h久久精品五福影院1421 | 国产精品久久久久天天影视| 国内精品久久久久久久97牛牛| 中文精品久久久久人妻不卡| 日韩蜜芽精品视频在线观看| 国产原创精品 正在播放| 国产成人高清精品免费观看| 99精品国产一区二区| 永久免费精品视频| 亚洲精品自产拍在线观看动漫 | 国产精品久久国产精品99盘 | 国产精品五月天强力打造| 2024最新国产精品一区| 久久精品国产亚洲网站| 国产精品你懂得| 久久er热视频在这里精品| 九九在线精品视频专区| 久久精品国产半推半就| 亚洲精品自产拍在线观看动漫| 一区二区三区精品国产欧美| 国产精品无码国模私拍视频| 精品久久久久久无码中文字幕|