1

次のコードの背後にある理由を知っている人はいますか? これは、Web テストから VS2010 で生成されます。

yield return someObject;
someObject = null;

私はこれを見て奇妙だと思ったので、someObject を割り当てられたメモリとしてそこに置くことで何らかの利益が得られるかどうかを誰かが知っているかどうか疑問に思っていました。明確にするために、問題の行は2番目のステートメントです.yield returnはかなり一般的です. 遅延戻りオブジェクトを null に設定すると、バグが発生します。

編集:より多くのコンテキスト。"yield return" は、IEnumerable を返すメソッドで実行されるため、実行が遅延します。someObject は、メソッド スコープの変数です。

ありがとう!

4

3 に答える 3

2

.NET は、ローカル変数が使用されなくなった時期を判断するのに非常に優れており、参照されたオブジェクトは、変数がまだスコープ内にある場合でも、メソッドの途中でも収集可能になります (コンパイラが使用されないことを証明できる限り)。再びアクセスできます。.NET でのオブジェクトの有効期間は、スコープとは関係ありません。

したがって、この行はまったく役に立たず、実際にはオブジェクトをより長く存続させることができます。ほとんどの場合、Kirill が言ったように、コード ジェネレーターによって出力された無害なコードです。

ただし、コンパイラがクロージャまたはコルーチンに遭遇すると (コルーチンyield returnを作成します)、ローカル変数はヘルパー クラスのメンバーに昇格します。そして、クラスメンバーは早く集めることができません。そのため、到達不能にするために割り当てnullが必要になる場合があります。

于 2012-10-09T22:20:44.223 に答える
0

これが生成されたコードになると、これは別の場所での「洗練されていないコード」の結果である可能性があります。生成されるコードは場合によって異なります。これは、人間が書いたコードよりもチェックが難しいことを意味します。

他の、おそらくもっと複雑なシナリオでは、これが重要になることは容易に想像できます。そして、これは誰にも害を及ぼさない無駄な行です..

于 2012-10-09T22:04:09.143 に答える
0

おそらく、含まれているメソッドでの遅延実行に関連していますか? IEnumerable の結果に屈する必要があるため、遅延実行が行われていると想定できます。

于 2012-10-09T21:32:44.700 に答える