状態管理に IDisposable を使用する
C では、一般的なパターンとして、クラス A のコンストラクターとデストラクターを使用して開始条件と終了条件を処理します。クラス B の場合、スコープを出るときに既知の状態を保証します。これは純粋な RAII ではありませんが、確立された慣行です。
C# では、using と IDisposable を使用して同様のアプローチを使用できます。ただし、この使用法には次のような疑問が生じます。
質問: 例外安全のための「スコープ指定された動作」を取得する手段として using と IDisposable を使用するのは不正ですか?
答え:
一部の意見では、using と IDisposable のこの使用法は次のとおりであると考えられています。虐待。理由は次のとおりです。
たとえば、次のことを考慮してください。コード:
{ // Unlock the frobble this.Frobble.Unlock(); try { // May throw Foo(); this.Frobble.Fiddle(); Bar(); } finally { // Lock the frobble this.Frobble.Lock(); } }
このコードは、ロック解除後、try ブロックに入る前にスローされた例外によりフロブルがロック解除されたままになるという問題に対して脆弱です。この状態変更の処理に using を使用すると、この脆弱性の検出がさらに困難になります。
したがって、通常は、リソース管理の本来の目的に using を使用し、状態管理には使用しないことをお勧めします。
以上がC# での状態管理に `using` と `IDisposable` を使用することは不正行為ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。