C#のdispose()とfinalize()の違い
コンテンツ
メソッドdispose()およびfinalize()は、オブジェクトによって保持されているアンマネージリソースを解放するために呼び出されるC#のメソッドです。 dispose()メソッドはインターフェイスIDisposable内で定義されていますが、finalize()メソッドはクラスオブジェクト内で定義されています。 dispose()とfinalize()の主な違いは、メソッドが 廃棄する()はユーザーが明示的に呼び出す必要がありますが、 finalize() オブジェクトが破棄される直前に、ガベージコレクターによって呼び出されます。以下に示す比較チャートを使用して、それらの間の他のいくつかの違いを調べてみましょう。
- 比較表
- 定義
- 主な違い
- 結論
比較表
比較の根拠 | 処分() | finalize() |
---|---|---|
定義済み | メソッドdispose()は、インターフェースIDisposableインターフェースで定義されています。 | java.lang.objectクラスで定義されているfinalize()idメソッド。 |
構文 | public void Dispose(){ //ここにコードを配置します } | protected void finalize(){ //ファイナライズコードはこちら } |
呼び出された | メソッドdispose()はユーザーによって呼び出されます。 | メソッドfinalize()は、ガベージコレクターによって呼び出されます。 |
目的 | メソッドdispose()は、呼び出されるたびにアンマネージリソースを解放するために使用されます。 | メソッドfinalize()は、オブジェクトが破棄される前にアンマネージリソースを解放するために使用されます。 |
実装 | メソッドdispose()は、close()メソッドがあるたびに実装されます。 | メソッドfinalize()は、管理されていないリソースに対して実装されます。 |
アクセス指定子 | メソッドdispose()はpublicとして宣言されています。 | メソッドfinalize()はprivateとして宣言されています。 |
アクション | メソッドdispose()はより高速で、オブジェクトを即座に破棄します。 | メソッドのファイナライズは、処分と比較して遅い |
性能 | メソッドdisposes()は瞬間的なアクションを実行するため、ウェブサイトのパフォーマンスには影響しません。 | メソッドのfinalize()が遅いと、Webサイトのパフォーマンスに影響します。 |
dispose()の定義
dispose()メソッドは、クラスのオブジェクトによって保持されているアンマネージリソースを解放します。アンマネージリソースはファイル、データ接続などです。メソッドdispose()はインターフェイスで宣言されます IDisposeable また、インターフェイスIDisposableを実装することにより、クラスによって実装されます。このメソッドは自動的には呼び出されません。プログラマは、他の人が使用するカスタムクラスを作成するときに、手動で実装する必要があります。メソッドの構文は次のとおりです。
public void dispose(){//ここにコードを破棄}
上記の構文では、メソッドがパブリックとして宣言されていることがわかります。これは、このメソッドがインターフェイスIDisposableで定義されており、このインターフェイスを実装するクラスによって実装する必要があるためです。そのため、実装クラスへのアクセシビリティを提供するために、メソッドはパブリックとして宣言されています。
このメソッドは、呼び出すように実装されているプログラムのコードによって手動で呼び出されます。メソッドのパフォーマンスは高速で、クラスのオブジェクトが保持しているリソースを即座に解放します。
finalize()の定義
finalize()メソッドは、 対象 クラス。クリーンアップ活動に使用されます。このメソッドは、オブジェクトの参照が長時間使用されないときにガベージコレクターによって呼び出されます。ガベージコレクターは管理対象リソースを自動的に解放しますが、ファイルハンドル、データ接続などの非管理対象リソースを解放する場合は、finalizeメソッドを手動で実装する必要があります。ガベージコレクターは、オブジェクトを完全に破棄する直前にfinalize()メソッドを呼び出します。
メソッドfinalize()の構文:
protected void finalize(){//ここにファイナライズコード}
上記の構文では、finalize()メソッドがprotectedとして宣言されています。この理由は、メソッドfinalize()がクラスの外部からアクセスできてはならず、ガベージコレクターのみがアクセスできる必要があるためです。
finalize()メソッドは、メモリを即座に解放しないため、パフォーマンスのコストに影響します。 C#では、デストラクターを使用してfinalizeメソッドが自動的に呼び出されます。
- メソッドdispose()はインターフェースで定義されています IDisposable。一方、メソッドfinalize()はクラスで定義されています 対象.
- メソッドdispose()は、プログラマーがコード内で手動で呼び出す必要がありますが、メソッドfinalizeは、オブジェクトを破棄する前にガベージコレクターによって自動的に呼び出されます。
- メソッドdisposeはいつでも呼び出すことができますが、メソッドfinalizeは、ガベージコレクターがそのオブジェクトが長時間参照されていないことを検出すると呼び出されます。
- メソッドdispose()は、インターフェイスIDisposableを実装した後、クラスに実装されます。メソッドfinalize()は、 管理されていないリソース マネージリソースはガベージコレクターによって自動的に解放されるためです。
- メソッドdispose()のアクセス指定子は、IDisposableインターフェイスで定義されているためパブリックであり、このインターフェイスを実装するクラスによって実装されるため、パブリックである必要があります。一方、メソッドfinalize()はアクセス指定子を保護しているため、クラス外のメンバーはアクセスできません。
- メソッドdispose()は高速で、オブジェクトを即座に解放するため、パフォーマンスコストには影響しません。メソッドfinalize()は遅く、オブジェクトによって保持されているリソースを即座に解放しません。
結論:
ファイナライズよりも高速であるため、メソッドfinalize()よりメソッドdispose()を使用することをお勧めします。また、必要なときにいつでも呼び出すことができます。