web-dev-qa-db-ja.com

インラインイベントハンドラーを書くのは悪い習慣ですか?

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

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

私はこれが好きです:

// 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();
}
57
Homam

絶対に問題ありません-ただし、2つの注意事項があります。

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

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

// We don't care about the arguments here; SaveDocument shouldn't need parameters
saveButton.Click += delegate { SaveDocument(); };
72
Jon Skeet

ほとんどの場合、「timer_Tick()」のような個別のメソッドが必要ですが、OnTimerTick()と呼ばれるべきです:

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

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

3
Ian Ringrose

2つのサンプルをまとめます。 2番目のオプション(これは好ましくありません)が最も読みやすいことは明らかです。

コードの読みやすさと保守性は非常に重要です。物事をできるだけ簡単に、理解しやすいものにしてください。ラムダ式は一般に、大半の人が理解するのが難しいと考えられています。他の人にとってあなたにとって第二の性質であってもそうではないかもしれません。

0
Liviu M.