はいできます。オブジェクトの存続期間が何らかの形で囲みスコープに関連しているという誤解はよくあります(たとえば、foo
スコープが終了した場合にのみvery_large_object
を収集することができます)。あなたは、簡単なアプリケーションを使用して、特定のケースを確認することができます。
class Program {
static void Main() {
var o = new TestObject();
var test = Console.ReadKey();
if (test.Key == ConsoleKey.Enter) {
DoSomething();
Console.ReadKey();
return;
}
DoSomethingElse(o);
}
static void DoSomething() {
Console.WriteLine("doing something");
Thread.Sleep(500);
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("GC ran");
}
static void DoSomethingElse(TestObject o) {
Console.WriteLine(o);
}
}
public class TestObject {
public TestObject() {
}
~TestObject() {
Console.WriteLine("finalizer running");
}
}
あなたが最適化とリリースモードで有効になっていることをコンパイルした場合(コンソールでEnterキーを押した後)、それは出力は次のようになります。
doing something
finalizer running
GC ran
ので、 o
はゴミとみなされ、私たちがまだDoSomething
メソッドの中にいる間にファイナライザキューに入れられたことは明らかです。オプティマイザは、DoSomethingElse
でブランチを投げ捨てることはできませんでした。なぜなら、実行するかどうかはコンソール入力に依存するからです。 return
を削除した場合は、もちろん収集されません。
出典
2017-04-08 15:23:09
Evk
very_large_objectのみをインスタンス化するにはどうすればよいですか?if節は必要な場合にインスタンス化しますか? –
@GianPaolo私は私のコードを単純化したようです...条件は実際には 'very_large_object'に依存します。しかし、私はそれをnullに設定して安全にするべきだと思います。 – sqd