1

イベントを次のように登録する利点は何ですか。

void MyMethod()
{
    button1.Click += delegate (object sender, EventArgs e)
    {
        ..
    }
}

と比較して:

void MyMethod()
{
    button1.Click += new System.EventHandler(this.button1_Click);
}

void button1_Click(object sender, EventArgs e)
{
    ..
}

更新: そして、それを購読解除するのはどうですか?

4

4 に答える 4

3

利点は、名前とクラス内の場所を思いつく必要がないことです。

イベントを登録するコードに密接に結合された軽い関数の場合、短いバージョンの方が便利です。

delegateと交換することもできます。=>

button1.Click += (object sender, EventArgs e) =>   
{
    ..
}
于 2012-04-04T06:42:15.080 に答える
3

さらに簡潔にすることができます:

button1.Click += ( sender, e ) =>
{
};

構文的にはきれいです (名前付きメソッドに分割した方がよいコードの長いブロックにつながらない限り)。

インライン宣言はクロージャーであり、匿名メソッドに隣接する変数にアクセスできます。

From: .NET の「クロージャ」とは?

本質的に、クロージャーは後で実行できるコードのブロックですが、最初に作成された環境を維持します。つまり、クロージャーを作成したメソッドのローカル変数などをその後も使用できます。メソッドの実行が終了しました。

参照: http://csharpindepth.com/articles/chapter5/closures.aspx

于 2012-04-04T06:42:27.720 に答える
2

イベントハンドラーを匿名デリゲートまたはラムダに登録する場合、より短いコードを記述してクロージャを使用できます。ただし、イベントの購読を解除することはできません。イベントハンドラーのコードが長すぎると、コードが醜くなります。

于 2012-04-04T06:45:17.573 に答える
1

それはコーディングスタイルに関するものです。

最初のケースのように宣言すると、「スパゲッティコード」を回避し、(必要に応じて) より自然な (人間が読める方法で) ハンドラー関数のローカル変数に挿入できることに注意してください。

より明確にするために。最初のケースのように書くことで、次のことができます。

int x = 0; 

System.Windows.Forms.Button button = new System.Windows.Forms.Button(); 
button.Click += (o,e)=> {   
++x; 
};

イベント ハンドラー内では、ハンドラー メソッドのスコープに対して実際に宣言されたローカル変数にアクセスできます。ほとんどの人にとって、それは「自然」に思えますが、開発者のように考えれば、それは不可能ですらありません。

幸運を。

于 2012-04-04T06:42:13.410 に答える