追加の予防措置を講じて IDisposable を正しく実装する
Visual Studio 2012 のような洗練されたプログラミング環境の出現により、ベスト プラクティスがこれまで以上に重要視されています。そのような実践の 1 つは、アンマネージ リソースを扱うときに IDisposable インターフェイスを適切に実装することです。
提供された例では、User という名前のクラスが IDisposable を実装しています。ただし、コード分析では、実装が正しくないというエラーが発生します。この問題を理解するには、IDisposable の目的を理解することが重要です。
IDisposable とは?
IDisposable を使用すると、オブジェクトはガベージ コレクションされる前にマネージド リソースとアンマネージド リソースの両方を解放できます。 。マネージド ヒープに割り当てられたメモリなどのマネージド リソースは、ガベージ コレクターによって自動的に回収されます。ただし、ファイル ハンドルやデータベース接続などのアンマネージ リソースは、リソース リークを防ぐために明示的に破棄する必要があります。
IDisposable を正しく実装する
提供されるコードは、次の方法で IDisposable を実装します。 :
public void Dispose() { id = 0; name = String.Empty; pass = String.Empty; }
このコードは、単に、クラスがインスタンス化されました。ただし、破棄されるアンマネージド リソースがないため、この実装はコード分析ルールに従って正しくありません。
修正された実装
IDisposable を実装する正しい方法以下に示します:
public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { // Free managed resources here. } // Free unmanaged resources, if any. }
この実装では、Dispose メソッドは次のようにシールされています。 「Dispose(bool)」は、マネージド リソースとアンマネージド リソースを解放する必要がある両方のケースに対応します。保護された仮想 Dispose(bool) メソッドは、追加のクリーンアップ要件をサポートするために派生クラスでオーバーライドできます。これにより、オブジェクトが使用されなくなったときに、管理対象外のリソースが正しく破棄されるようになります。
以上がリソース リークを避けるために IDisposable インターフェイスを正しく実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。