デモンストレーションから始めましょう。
[TestMethod]
public void Test()
{
var h = new WeakReference(new object());
GC.Collect();
Assert.IsNull(h.Target);
}
このコードは期待どおりに機能します。ガベージ コレクションが終了すると、 in の参照h
は無効になります。さて、ここにひねりがあります:
[TestMethod]
public void Test()
{
var h = new WeakReference(new object());
GC.Collect();
try { } // I just add an empty
finally { } // try/finally block
Assert.IsNull(h.Target); // FAIL!
}
行の後に空の try/finally ブロックをテストに追加するとGC.Collect()
、弱い参照オブジェクトが収集されません! 行の前に空の try/finally ブロックが追加されてGC.Collect()
いる場合でも、テストはパスします。
何を与える?try/finally ブロックがオブジェクトの寿命にどのように影響するかを正確に説明できる人はいますか?
注: すべてのテストはデバッグで行われます。リリースでは、両方のテストに合格します。
注 2: アプリを再現するには、.NET 4 または .NET 4.5 ランタイムのいずれかをターゲットにする必要があり、32 ビットとして実行する必要があります (x86 をターゲットにするか、[32 ビット優先] オプションがオンになっている任意の CPU)。