2

これは主に好奇心のためです。この構成で考えられるほとんどすべてのユースケースを実装するためのより良い方法があります(少なくとも、C#や他の言語では、私は定期的に使用しています)が、最近、スコープ付きミューテックスをここで見ました。クールなコンセプト。

私の質問は、usingステートメントは、それが作用しているオブジェクトへの参照を維持しますか(つまり、GCが実行されないようにしますか)?

たとえば、私が行う場合:

using (new ScopedMutex())
{
// ...
}

ScopedMutexオブジェクトは、usingブロックの最後までその存在を維持しますか、それともGCを実行して、ブロックの途中で破棄しますか?

4

3 に答える 3

6

いいえ、GCはそれを破棄しません。そのオブジェクトへの参照はローカル変数に格納されます(詳細については、この回答を参照してください)。ローカル変数はGCルートと見なされ、そこからオブジェクトに到達可能になります(usingブロックがローカル変数を呼び出すDisposeには、ローカル変数に到達可能である必要があります)。

于 2010-02-24T23:31:00.417 に答える
2

C# コンパイラは暗黙的に変数を作成します。using ステートメントは、実際にはコンパイル時に次のようなものに変換されます ( Redgate Reflectorを使用して、正確なコードを自分で確認できます)。

ScopedMutex scopedMutex1 = new ScopedMutex();
try
{
    // ...
}
finally
{
    scopedMutex1.Dispose();
}
于 2010-02-24T23:35:06.083 に答える
0

ブロックの途中で廃棄することはありません。

于 2010-02-24T23:31:29.900 に答える