4

イベントを処理するために私が知っているすべての方法を次に示します。他の構文は、範囲をいじっているだけです。

// one
Button.Click += delegate { /* do something */ };

// two
Button.Click += delegate(object s, EventArgs e) { /* do something */ };

// three
RoutedEventHandler handler = (s, e) => { /* do something */ };
Button.Click += handler;
Button.Click -= handler;

// four
Button.Click += (s, e) => { /* do something */ };

数値は理解していますone/two結果のロジックで使用できる明示的な引数を除いて、基本的に同じです。threeまた、数によってハンドラーを追加および削除できることも理解しています。これは非常に重要な場合があります。そして、数字fourは数字の2の単純化されたバージョンであることを理解しています.

私の質問はより実用的です。これら 2 つの構文の間に、どちらか一方を使用する理由がありますか、それとも基本的に同じことを行う 2 つの方法ですか? そして、どうやって知っていますか?

// two
Button.Click += delegate(object s, EventArgs e) { /* do something */ };

// four
Button.Click += (s, e) => { /* do something */ };
4

1 に答える 1

4

これら2つの構文の間に、一方を他方よりも優先して使用する理由はありますか、それとも基本的に同じことを行う2つの方法ですか?

彼らは事実上同じことをします。どちらの場合も、コンパイラは匿名でメソッドを生成し、デリゲートを作成して割り当てます。新しいラムダ構文の主な利点は、短いことです。Anonymous Methodのドキュメントでは、代わりにラムダ構文 (構文 4) を使用することを提案しています。

C# 2.0 では匿名メソッドが導入されました。C# 3.0 以降では、インライン コードを記述するための推奨される方法としてラムダ式が匿名メソッドに取って代わりました。

匿名メソッドの構文 ( を使用delegate) には、ラムダ構文にはないもう 1 つの機能があることに注意してください。引数を使用しない場合は、省略して次のように記述できます。

Button.Click += delegate { /* do something */ };

そうは言っても、ラムダ式(構文 4) は、式ツリーの作成に同じ構文を使用し、C# 5 の非同期ラムダのサポートを使用して、より良い暗黙の型指定を含む、匿名メソッドよりも追加の機能をサポートしています。

于 2013-06-17T17:54:50.257 に答える