Finalize/disposeリソースクリーンアップモード

3877 ワード

最近仕事を探す准备をしているので、図书馆からも1册借りました.Netプログラマーの面接の“宝典”、本人はずっとどんなプログラマーの秘技、宝典を信じないで、しかし偏激ではありませんて、1冊の本は少なくとも他の人の経験で、多少やはり収益することができます.私もこまごました时間を利用してよく読んで、構造関数と資源の整理について見たとき、自分が中のメカニズムと原理がよく分からないことに気づいて、いくつかの資料を調べて、自分の理解を書いた.
C#の解析関数
c++の構造関数とは異なり、C#の構造関数はインスタンスが失効すると呼び出されません.によってNetのごみ回収メカニズムでは,構造関数がいつ呼び出されるか分からないし,構造関数を明示的に呼び出すこともできない.構造関数は,オブジェクトが管理されたスタックから解放される前のある時点で呼び出されることを知っているだけである.
したがって、コードに貴重なリソース(データベースの接続、ブラシ、ハンドルなど)が含まれている場合は、構造関数で処理しないでください.構造がいつ実行できるか分からないからです.だから、私たちはずっと私たちがコントロールできる方法を考えなければなりません.私たちは資源の解放を正確にコントロールすることができます.今、Dispose方法が登場して、私たちがいつ非管理資源を解放するかを完全にコントロールするのに役立ちます.
C#の解析関数とFinalizeメソッド
C#コンストラクタコンパイル後に生成される中間ILコードは,Ildasmの逆アセンブリプログラムにより,C#のコンストラクタが見えないが,Finalizeメソッドが1つ増えただけで,これがCLRにおけるコンストラクタの本来の姿である.オブジェクトがアクセス不可になると、Finalizeメソッドが自動的に呼び出されます.
DisposeメソッドFinalizeメソッドの代わりに標準クリーンアップモード
Disposeメソッドでは、管理されていないリソースの解放を自分で表示できます.データベース接続のような希少なリソースは、十分に利用できます.Disposeメソッドは、まずIDisposableインタフェースを実装する必要があります.コードは次のとおりです.
   
public class MyClass : IDisposable
    {
        private bool disposed = false;

        //Implement IDisposable.
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);//
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!disposed)
            {
                if (disposing)
                {
                    //       
                }
                //       
                disposed = true;
            }
        }

        
        ~MyClass()
        {
            Dispose(false);
        }
    }

プログラム中のdisposedはフラグビットとして,Dispse()メソッドを呼び出した後,構造関数呼び出し時にリソースが再解放されないようにする.あるいは,不注意なプログラマーがDispose()を呼び出すのを忘れた場合,非管理リソースは構造関数においても解放される場合がある.  .NETフレーム内の寸法クリーンアップモード
はい.Netのフレームワークの多くは、データベース接続の解放、ファイル、ストリームの解放などの標準クリーンアップモードに適用されています.
  
public   void Close()
        {
            Dispose();
        
        }

ごみ回収メカニズムについて
ごみ回収メカニズムにかかわる必要があると思う人は多いのではないでしょうか.いくつかのメカニズムを理解すべきだと思います.私たちが資源を処理するとき、私たちは一般的にゴミ回収メカニズムに関心を持っていません.ゴミ回収メカニズムはメモリ回収を最適化するのに役立つからです.しかし,非管理リソースに関わる場合,時間の問題に関心を持ち,リソースの利用問題を最適化できれば,多くのプログラムの実行効率を向上させることができる.