これは、「C# 経由の CLR」、「効果的な C#」およびその他のリソースから IDisposable およびファイナライザーについて理解していることです。
- IDisposable は、マネージド リソースとアンマネージド リソースを確定的にクリーンアップするためのものです。
- アンマネージ リソース (ファイル ハンドルなど) を担当するクラスは、IDisposable を実装し、クライアント コードがインスタンスで Dispose() を呼び出さなくてもクリーンアップされることを保証するファイナライザーを提供する必要があります。
- 管理対象リソースのみを担当するクラスは、ファイナライザーを実装しないでください。
- ファイナライザーがある場合は、IDisposable を実装する必要があります (これにより、クライアント コードは正しいことを実行して Dispose() を呼び出すことができますが、ファイナライザーは忘れた場合のリソースのリークを防ぎます)。
上記のすべての理由を理解して同意しますが、これらのルールを破ることが理にかなっているシナリオが 1 つあります。それは、管理されていないリソース (特定のファイルへの単一アクセス ポイントを提供するなど) を担当するシングルトン クラスです。 )。
シングルトンインスタンスはアプリケーションの存続期間中存続する必要があり、クライアントコードが Dispose() を呼び出すと、詰め込まれているため、シングルトンに Dispose() メソッドを持つことは常に間違っていると思います。ただし、アプリケーションがアンロードされたときにファイナライザーがアンマネージ リソースをクリーンアップできるように、ファイナライザーが必要です。
したがって、IDisposable を実装しないファイナライザーを備えたシングルトン クラスを持つことは、合理的なことのように思えますが、このタイプの設計は、私が理解しているベスト プラクティスに反しています。
これは合理的なアプローチですか?そうでない場合、その理由と、優れた代替手段は何ですか?