推奨されます, 2022

エディターズチョイス

C#におけるdispose()とfinalize()の違い

メソッドdispose()およびfinalize()は、オブジェクトによって保持されているアンマネージリソースを解放するために呼び出されるC#のメソッドです。 dispose()メソッドはインタフェースIDisposable内で定義されていますが、メソッドfinalize()はクラスオブジェクト内で定義されています。 dispose()とfinalize()の主な違いは、dispose()メソッドはユーザーが明示的に呼び出す必要があるのに対し、 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()は瞬間的なアクションを実行するため、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()の主な違い

  1. メソッドdispose()は、 IDisposableインターフェイスで定義されています。 一方、メソッドfinalize()はクラスオブジェクトに定義されています
  2. dispose()メソッドはプログラマによってコード内で手動で呼び出される必要がありますが、finalizeメソッドはオブジェクトを破棄する前にガベージコレクタによって自動的に呼び出されます。
  3. メソッドdisposeはいつでも呼び出すことができますが、finalizeメソッドは、そのオブジェクトが長期間参照されていないことを検出したときにガベージコレクタによって呼び出されます。
  4. メソッドdispose()は、インタフェースIDisposableを実装した後でクラスに実装されます。 管理対象リソースはガベージコレクタによって自動的に解放されるため、メソッドfinalize()は管理対象外リソースに対してのみ実装する必要があります。
  5. dispose()メソッドのアクセス指定子は、IDisposableインタフェースで定義されているのでpublicであり、このインタフェースを実装するクラスによって実装されるため、publicにする必要があります。 一方、メソッドfinalize()はアクセス指定子を保護しているため、クラス外のどのメンバからもアクセスできないようになっています。
  6. dispose()メソッドは高速でオブジェクトを即座に解放するので、パフォーマンスコストには影響しません。 メソッドfinalize()は遅くなり、オブジェクトによって保持されているリソースを即座に解放しません。

結論:

finalizeよりも速いので、finalize()メソッドよりもdispose()メソッドを使用することをお勧めします。 また、必要に応じていつでも呼び出すことができます。

Top