<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      基礎才是重中之重~對象的生與死

      回到目錄

      為何要寫

      之所以寫這篇文章,完全是因為學生們在實際開發中遇到的問題,一個對象占用的內存空間總不被釋放,導致系統內存不斷攀升,其最主要原因是我們對“對象的生與死”不清楚,或者從來沒有認真去考慮過這件事,確實一個對象在被聲音,初始化,使用或者最后被系統回收,整個的過程與我們關系確實不大,我們開發人員直接用就行了,對于C#這種托管語言你沒必要去自己回收它,但有時,我們多了解一點系統的回收機制,對我們的程序還是很有好處的。

      對象的種類(根據作用域)

      1 類對象,靜態對象,使用static修飾符進行聲明,作用域為整個類(所有實體公有),當你的程序運行期間它一直不會被回收,直到你的進程結束(所以使用它要注冊,大數據一般不用類對象存儲)

      2 類級別的實例對象,它定義在類里,方法體外面,作用域為整個類的當前實例,它的回收時機我們無法確定,當然你可以手動進行  GC.Collect()來馬上釋放它,否則由系統的垃圾回收機制管理它

      3 方法級別的實例對象,局部對象,它定義在方法內部,作用域為當前方法體,方法執行完成后,自動釋放

      代碼中的實驗

          public class Product
          {
              ~Product()
              {
                  Logger.LoggerFactory.Instance.Logger_Info("Product對象已經被釋放");
              }
              public int ID { get; set; }
              public string Name { get; set; }
          }
      
          public class ProductConfig
          {
              ~ProductConfig()
              {
                  Logger.LoggerFactory.Instance.Logger_Info("ProductConfig對象已經被釋放");
              }
              public int ID { get; set; }
              public string Name { get; set; }
          }
              /// <summary>
              /// 類級別的
              /// </summary>
              ProductConfig productConfig = new ProductConfig();
              public ActionResult Create()
              {
                  /// <summary>
                  /// 實例成員,方法體里
                  /// </summary>
                  Product product = new Product();
                  GC.Collect();//清除全局實例成員,否則全局實例對象將不會馬上清楚,它會等待垃圾回收
                  return View();
              }

      上面代碼在執行后,會寫入日志文件,由于在方法里使用了GC.Collect()方法,這時全局實例對象ProductConfig將會在方法執行后被釋放,如果不加這個方法,那么ProductConfig何時釋放,我們是不知道的。

      Dispose模式

      對上面的操作是我們刻意去進行的,意思就是讓大家看到,對象何時會被釋放,而對象在被釋放后,會執行類的析構方法(~開頭的),它在C#里很少被使用,或者我們很少關注它,因為你不去實現它,系統垃圾回收結束后也會去調用它,這是對于托管資源說的,我們在C#這個開發語言里,有時也會涉及到使用一些“非托管”資源,比如數據庫連接,網絡通訊,文件訪問等等,它們是不受當前Frameworks CLR控制的,或者說CLR也控制不了它,因為它已經脫離了當前應用程序,這也算是合情合理,這時,這些非托管資源會實現自己的“資源釋放”方法,好Dispose,大家如果有心的話,都會發現像文件,SQL連接,socket,Tcp等對象,都有Dispose方法,它的意思就是釋放當前對象,而我們在使用它們時,如何把非托管與托管對象結合起來,一起把對象釋放呢,這就是現在要說的Dispose模式

         /// <summary>
          /// 實現IDisposable,對非托管系統進行資源回收
          /// 作者:倉儲大叔
          /// </summary>
          public abstract class DisposableBase : IDisposable
          {
              /// <summary>
              /// 標準Dispose,外界可以直接調用它
              /// </summary>
              public void Dispose()
              {
                  Logger.LoggerFactory.Instance.Logger_Debug("Dispose");
      
                  this.Dispose(true);////釋放托管資源
                  GC.SuppressFinalize(this);//請求系統不要調用指定對象的終結器. //該方法在對象頭中設置一個位,系統在調用終結器時將檢查這個位
              }
      
              private void Dispose(bool disposing)
              {
                  if (!_isDisposed)//_isDisposed為false表示沒有進行手動dispose
                  {
                      //清理托管資源和清理非托管資源
                      Finalize(disposing);
                  }
                  Logger.LoggerFactory.Instance.Logger_Debug("Dispose complete!");
                  _isDisposed = true;
              }
      
              /// <summary>
              /// 由子類自己去實現自己的Dispose邏輯(清理托管和非托管資源)
              /// </summary>
              /// <param name="disposing"></param>
              protected abstract void Finalize(bool disposing);
      
              private bool _isDisposed;
      
              /// <summary>
              /// 是否完成了資源的釋放
              /// </summary>
              public bool IsDisposed
              {
                  get { return this._isDisposed; }
              }
              /// <summary>
              /// 析構方法-在類被釋放前被執行
              /// </summary>
              ~DisposableBase()
              {
                  Logger.LoggerFactory.Instance.Logger_Debug("析構方法");
      
                  //執行到這里,托管資源已經被釋放
                  this.Dispose(false);//釋放非托管資源,托管資源由終極器自己完成了
              }
          }

      使用它

        public class ZzlTools : DisposableBase
          {
      
              protected override void Finalize(bool disposing)
              {
                  if (!disposing)
                  {
                      //清除托管
                  }
                  //清理非托管
              }
          }

      通過大叔整理的Dispose基類,我們可以看到,外界的對象只要實現Finalize方法即可,把自己需要釋放的對象寫在Finalize里就行了,簡單!

      最后,和大家分享我的一個經驗,學習基礎知識,就像修煉內功,我們一定要打好根基,才能更上一層樓!

      謝謝閱讀!

      回到目錄 

       

      posted @ 2016-04-15 15:00  張占嶺  閱讀(1829)  評論(5)    收藏  舉報
      主站蜘蛛池模板: 国产视频深夜在线观看| 日本一二三区视频在线| 精品日韩色国产在线观看| 精品国产福利久久久| 国产成人啪精品视频免费网| 精品综合久久久久久97| 久久精品人人槡人妻人人玩AV| 日本丰满熟妇hd| 成年无码av片完整版| 又粗又大又黄又硬又爽免费看| 亚洲综合无码久久精品综合| 欧美 日韩 国产 成人 在线观看| 日韩精品一区二区三区中文无码| 国产粉嫩美女一区二区三| 欧洲精品色在线观看| 国产在线永久视频| 中文字幕va一区二区三区| 中文字幕99国产精品| 亚洲精品久久久久玩吗| 国产精品天堂蜜av在线播放| 久久久久久久久久久免费精品| 色欲国产精品一区成人精品| 亚洲一区二区三区在线播放无码| 久久天堂综合亚洲伊人HD妓女| 樱花草视频www日本韩国| 色欧美片视频在线观看| 精品国产av最大网站| 亚洲av永久无码精品漫画| 精品人妻伦九区久久69| 高清国产一区二区无遮挡| 国产精品三级一区二区三区| 国产四虎永久免费观看| 人人妻一区二区三区| 伊人精品成人久久综合97| 加勒比无码av中文字幕| 天堂V亚洲国产V第一次| 国产精品无码无需播放器| 亚洲熟妇色自偷自拍另类| 午夜视频免费试看| 人妻出轨av中文字幕| 林口县|