67

インライン イベント ハンドラを記述するのは悪い習慣ですか?

私にとっては、次のようにイベント ハンドラーでローカル変数を使用する場合に使用することを好みます。

私はこれを好みます:

// This is just a sample
private void Foo()
{
    Timer timer = new Timer() { Interval = 1000 };
    int counter = 0; // counter has just this mission
    timer.Tick += (s, e) => myTextBox.Text = (counter++).ToString();
    timer.Start();
}

これの代わりに:

int counter = 0; // No need for this out of Boo & the event handler

private void Boo()
{
    Timer timer = new Timer() { Interval = 1000 };

    timer.Tick += timer_Tick;
    timer.Start();
}

void timer_Tick(object sender, EventArgs e)
{
    myTextBox.Text = (counter++).ToString();
}
4

3 に答える 3

79

まったく問題ありませんが、2 つの注意点があります。

  • クロージャー内からローカル変数を変更している場合は、自分が何をしているのかを理解していることを確認する必要があります。
  • イベントの登録を解除することはできません

通常、私は非常に単純なイベント ハンドラーのみをインラインします。より複雑なものについては、ラムダ式 (または匿名メソッド) を使用して、より適切なメソッドを持つメソッドへの呼び出しをサブスクライブします。

// We don't care about the arguments here; SaveDocument shouldn't need parameters
saveButton.Click += delegate { SaveDocument(); };
于 2010-10-31T15:51:16.087 に答える
3

ほとんどの場合、「timer_Tick()」のような個別のメソッドを使用したいと考えていますが、次のように OnTimerTick() と呼ぶ必要があります。

  • クラスを読むと、小麦が進んでいることは明らかです。「オン」は、その can イベント ハンドラーを教えてくれます。
  • 「インライン」の場合、メソッドにブレークポイントを設定する方が簡単です。
  • このイベントは、「Foo」請負業者が戻ってからかなり時間がたって発火し、請負業者の範囲内で実行されているとは思えません。

ただし、インラインで宣言されているメソッドが返される前にのみイベントが発生し、イベントが設定されているオブジェクトのスコープが宣言メソッドに限定されている場合は、「インライン」バージョンの方が優れていると思います。したがって、「並べ替え」メソッドに渡される比較デリゲートに「インライン」を使用するのが好きです。

于 2010-11-01T10:59:03.787 に答える
0

2 つのサンプルを一緒に配置します。2 番目のオプション (好みではない) が最も読みやすいことは明らかです。

コードの可読性と保守性は非常に重要です。できるだけシンプルに、理解しやすいようにします。ラムダ式は一般的に、大多数の人にとって理解しにくいと考えられています。それらがあなたにとって第二の性質であっても、他の人にとってはそうではないかもしれません.

于 2010-10-31T21:12:27.997 に答える