9

さて、「ラムダ式」のトピック (第 17 章、デリゲート、デリゲートの C# 構文シュガー) について説明します。Jeffery は、C# コンパイラがバックグラウンドで次のような新しい非静的クラスを作成すると述べています。

  1. ラムダ式でアクセスされたすべてのローカル変数を格納するフィールド。
  2. 本体に Lambda 式が含まれ、署名/戻り値の型が Lambda Expressin が使用されたデリゲートと一致するメソッド。

次の 2 つの質問があります。

  1. 私は自分で少しデバッグを行い、ラムダ式がローカル変数の値を変更する場合(ラムダ式が使用されているメソッドで定義されている)、新しい値が式本体の外にも反映されることを確認しました。式が実際には別のクラスにあることを考えると、これはどのように可能ですか?

  2. 静的クラスで同じことが完全に実行できるのに、発行されたクラスを非静的にする必要があるのはなぜですか?

これが、私が理解できないほど単純な概念ではないことを願っています。

詳細を提供する必要がある場合はお知らせください。

4

1 に答える 1

5

まず、数日前に同様の質問がありました。

クロージャでキャプチャされた変数は、元の変数も変更します

第二に、それを静的クラスにするポイントは何ですか? いずれにせよ作成されるオブジェクトは 1 つだけであり、そのオブジェクトはアプリケーションの存続期間中存続する必要はありません。

the new value is reflected outside the expression body too. How is this possible considering the expression is actually in a different class.

問題は、anonymus メソッドと anonymus メソッド外のローカル変数の両方で同じオブジェクトが参照されているため、どこから変更しても問題なく、同じものを変更することです。

また、私がリンクした質問でティム・グッドマンが提供した回答は、匿名メソッド内に新しいオブジェクトを作成することにより、変更がどこにでも反映されるのを避けるために何をすべきかを示しています。

于 2013-03-14T09:14:13.550 に答える