2

コード分​​析でCA2000エラーが発生し、スコープを終了する前にオブジェクトを破棄するように求められました

スコープを失う前にオブジェクトを破棄する メソッド 'MyMethod(Guid?)' で、オブジェクトへのすべての参照がスコープ外になる前に、オブジェクト 'person' で System.IDisposable.Dispose を呼び出します。

スコープを出るときに dispose が自動的に実行されると思っていたので、このルールには驚きました。注: 同様の質問がすでに出されており、廃棄手順を強制しないという私の意見を確認します。

オブジェクトを破棄せず、using 命令で使用しないとどうなりますか?

4

4 に答える 4

3

Dispose が自動的に呼び出されることはありません。明示的に呼び出すか、「using」キーワードを使用する必要があります。少なくとも、オブジェクトを破棄しない場合は、ガベージ コレクターによって処理される可能性がありますが、正しいパターンを実装している場合に限ります。

于 2012-12-13T15:35:51.600 に答える
2

スコープを終了すると、disposeが自動的に実行されると思いました。

スコープではなく、ブロックスコープのみです。usingメソッドを終了することは、usingブロックを終了することと同じではありません。

オブジェクトがを実装している場合は、IDisposable常に手動またはusingブロックを介して破棄する必要があります。コードの構造に基づいて、これをいつ行うかはあなた次第です。

于 2012-12-13T15:38:52.187 に答える
2

usingステートメント内でオブジェクトをラップしていれば、変換されるので問題ありません。

try{
    var myObject = new MyObject();
}finally{
    myObject.Dispose();
} 

アップデート

オブジェクトを破棄しないと、アタッチされたリソースを保持したまま「永久にメモリに残る可能性があります」 。しかし、そうではないかもしれません。ガベージコレクタがいつそれをクリアしようとするかによって異なります。ただし、GC は管理されたリソースのみをクリアできることに注意してください。

同様の質問については、こちらを参照してください:ペン オブジェクトで Dispose を呼び出さないとどうなりますか?

于 2012-12-13T15:36:44.363 に答える
1

オブジェクトがスコープ外に出たときに Dispose は呼び出されません。多くのシナリオでは、オブジェクトをガベージ コレクションするときに呼び出されます (実装された Finalizer と Dispose が呼び出されたとき)。

于 2012-12-13T15:36:16.440 に答える