2

私は次の違いを理解しようとしています:

someObject.SomeEventName += OnEventHappend;

private void OnEventHappened(object sender, EventArgs e)
{
}

someOBject.SomeEventName += ( o, e) => { };

違いはありますか、それはどちらにせよ重要ですか。

4

2 に答える 2

3

2番目は「ラムダ」と呼ばれます。これは、無名関数を作成する方法です。

最初の関数には名前があり、他の場所で使用できるのに対し、2 番目の関数には名前がないため、他の場所では使用できないという事実を除け、実際には違いはありません。

コンパイラは、ラムダを表すクラスとそのクラス内のメソッドを作成することになるため、技術的には名前があり、コードで使用することはできません。

おそらく最も注目すべき点は、ラムダが変数を閉じることができるということです。これは、ラムダ本体がそれ自体のスコープ外の変数を参照する場所です。つまり、次のようになります。

int value = 5;

someObject.SomeEvent += (s,e) => { Console.WriteLine(value);};

完全に名前の付いたメソッドを使用して同じ機能を実現できますが (結局、コンパイラはそのコードをある時点で名前の付いたメソッド/オブジェクトにリファクタリングします)、最終結果はクラス内の 1 つの新しいメソッドよりも少し複雑になります。

于 2013-05-22T18:00:18.307 に答える
1

明らかな違いの 1 つは、後者はステートメント ラムダとして実装された匿名イベント ハンドラーであるため、後で簡単にサブスクライブを解除できないことです。それの利点は、その簡潔さです。

于 2013-05-22T18:00:13.007 に答える