.Netコンポーネントプログラミングのオブジェクトライフサイクル



.Netコンポーネントプログラミングのオブジェクトライフサイクル
 
  • .NETごみ回収
  • IDisposable()
  • Using文
  • .NETゴミ回収
    CLRはゴミ回収器を管理し、ゴミ回収器は管理スタックを監視していますが、私たちが使用しているオブジェクトとシステムの起動に必要ないくつかの必須オブジェクト情報は管理スタックに存在します.CLRはリスト(オブジェクト参照情報リスト)を維持します.このリストに格納されている情報は、管理スタック内のすべてのオブジェクトに対応する情報(参照、参照情報)が、新しいオブジェクトを使用するたびに、または既存のオブジェクトを変更するたびに、オブジェクト参照情報リストを更新することです.では、回収器は一般的にいつ呼び出されますか?
    ごみ回収器の多くは、管理スタックが枯渇する場合にトリガーされる使用である、コードによって呼び出すこともできる(後述).
    ごみ回収器が呼び出されると、(オブジェクト参照情報リスト)から各オブジェクトがクライアント(これらのオブジェクトを使用するアプリケーション)に到達できるかどうかを巡回し、到達可能であればそのオブジェクトは到達可能とマークされ、スキップされます.(オブジェクトに参照があるかどうかを確認します)を続行し、マークされたオブジェクトが参照しているオブジェクトは再チェックされません.オブジェクトが参照されていないことを確認すると、これらのオブジェクトは回収され、空間圧縮され、引用されたオブジェクトのアドレスが変更されて空間圧縮されます.
    IDisposable()
    はい.NETでは、IDisposeインタフェースがリソースを解放するために提供されています.サンプルコードを見てください.
     1     public interface IMyinterface
     2     {
     3         void DoSomeThing();
     4     }
     5     public class StydyClass:IMyinterface,IDisposable
     6     {
     7         public void Dispose()
     8         {
     9             //    
    10         }
    11         public void DoSomeThing()
    12         {
    13             //do something
    14         }
    15     }

    クライアント呼び出しコードを見てみましょう.
    1 IMyinterface studyClass = new StudyClass();
    2 studyClass.DoSomeThing();
    3 
    4 IDisposable disposable = studyClass as IDisposable;
    5 if (disposable != null)
    6 {
    7    disposable.Dispose();
    8 }

    この呼び出しは安全ですね.studyClassがIDisposableをサポートしていない場合、asオペレータはNULL値を返します.問題はありませんが、クライアントオブジェクトが共有されている場合、多くのオブジェクトが使用している場合、IDisposableを正確に実行するのは誰ですか.Dispose(). DoSomeThing()関数の実行中にエラーが発生した場合、リソースは解放されますか?
    Using文
    C#はUsing文をサポートし、Using文を使用するときにDispose()メソッドを使用するtry/finallyブロックを生成します.もちろん、オブジェクトはIDisposableをサポートする必要があります.サンプルコードを見てみましょう.
    1 using (IMyinterface studyClass = new StudyClass())
    2 {
    3     studyClass.DoSomeThing();
    4 }

    このように書くと、コンパイルは通過しません.using文で使用するタイプは、システムに暗黙的に変換できる必要があります.IDisposableの.もちろん、このようなコードコンパイルを通過させる方法もあり、IMyinterfaceインタフェースもIDisposableから派生させることができます.これでコードを書くことができます.
      1 IMyinterface studyClass = new StudyClass();
     2 using (studyClass as IDisposable)
     3 {
     4    studyClass.DoSomeThing();
     5 }
     6 
     7 using (StudyClass studyClass = new StudyClass())
     8 {
     9    studyClass.DoSomeThing();
    10 }

    以上の書き方はすべて実現可能で、上の2つのコードは次のコードに等しい.
     1 StudyClass studyClass = new StudyClass();
     2 try
     3 {
     4    studyClass.DoSomeThing();
     5 }
     6 finally
     7 {
     8    if (studyClass != null)
     9     {
    10        IDisposable dis = studyClass;
    11         dis.Dispose();
    12     }
    13 }

    本編の内容は複雑で奥深くなく、ただ基礎的にオブジェクトのライフサイクル管理を説明しただけで、まだいくつかの深い知識は説明しません.また、私たちはオブジェクト向けに設計する時、いくつかの重要な使用率の高いオブジェクトに対して抽象的な設計に向かう準備をしている時、できるだけ抽象的なオブジェクトにIDisposableインタフェースを実現させます.これでも上記内容のエラーメッセージは出ません.