これらの関連リソースも参照してください。
- .NETガベージコレクターはコードの予測分析を実行しますか?(スタックオーバーフロー上)
- WP7:GCがローカル変数をガベージと見なすのはいつですか(MSDNのブログ記事)
言い換えると:
ローカル変数によって参照されているオブジェクトは、変数がスコープ外になる前に再利用できますか(たとえば、変数が割り当てられているが、再度使用されないため)、または変数が外れるまでガベージコレクションの対象外であることが保証されていますか?範囲?
説明させてください:
void Case_1()
{
var weakRef = new WeakReference(new object());
GC.Collect(); // <-- doesn't have to be an explicit call; just assume that
// garbage collection would occur at this point.
if (weakRef.IsAlive) ...
}
object
このコード例では、明らかに、新しい'edがガベージコレクターによって再利用される可能性を計画する必要があります。したがって、if
ステートメント。
weakRef
(私は、新しい'edがまだ存在するかどうかを確認することのみを目的として使用していることに注意してくださいobject
。)
void Case_2()
{
var unusedLocalVar = new object();
var weakRef = new WeakReference(unusedLocalVar);
GC.Collect(); // <-- doesn't have to be an explicit call; just assume that
// garbage collection would occur at this point.
Debug.Assert(weakRef.IsAlive);
}
このコード例の前のコード例からの主な変更点は、new'edobject
がローカル変数(unusedLocalVar
)によって強く参照されることです。weakRef
ただし、弱参照( )が作成された後は、この変数が再び使用されることはありません。
質問:準拠しているC#コンパイラーは、の最初の2行を、1つの場所でのみ、つまりコンストラクターへの引数として使用されているCase_2
とCase_1
判断した場合の行に最適化できますか?つまり、のアサーションが失敗する可能性はありますか?unusedLocalVar
WeakReference
Case_2