var foo = "bar";
new Func<String>(() =>
{
var foo = ""; // This can't be done in C#. Why is that?
/* In JavaScript, this is perfectly valid, since this scope (the anonymous
function) is disconnected from the outer scope, and any variable declared
within this scope will not affect variables in the outer scope */
})()
1880 次
3 に答える
12
実際、javascript でさえ、完全に切り離されているわけではありません。javascript はレキシカル クロージャを許可しvar
ますfoo
。
違いは、javascriptが(内側のスコープで) 別の意味で名前を再宣言できるようにすることです。C#はそうしないことを選択します。
C# バージョンの方が混乱しにくいと思います。特に、コード (メソッドのさらに下) が「古い」変数について話していると予想し、突然「新しい」変数を見始める場合。
于 2009-07-31T12:15:02.410 に答える
4
C# は、無名関数内のローカル変数をキャプチャします。これは実際には JavaScript もサポートする非常に強力な機能ですが、その方法は少し異なります。
この概念は、コンピューター科学者がクロージャーと呼んでいるものです。ローカル変数をキャプチャすることで、関数自体の状態の一部になることができるため、柔軟性が向上します。
于 2009-07-31T12:13:01.833 に答える
0
コードは両方のシンボルを「ローカル」として参照するため、コンパイラは、スコープ チェーン (ローカル -> メンバー -> 型) を上に移動するだけでは、どちらを参照しているかを検出できません。
参考までに、匿名メソッドはクラスとしてコンパイルされ、フィールドとしてアクセスするメンバー/ローカルに (プロパティとして) 割り当てられます。
于 2009-07-31T12:15:09.400 に答える