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