4

仮想メソッドにデリゲートするプライベート メソッドを登録するのではなく、仮想メソッドをイベント ハンドラーとして登録することに問題はありますか? 私はオプション 1 (これは機能しているようです) を好みますが、後で噛まれないようにしたいと考えています。

オプション1

public class Controller1
{
    public Controller1(EventNotifier eventNotifier)
    {
        eventNotifier.ImportantEvent += OnEventNotifierImportantEvent;
    }

    protected virtual void OnEventNotifierImportantEvent(object sender, EventArgs e)
    {
    }
}

オプション 2

public class Controller2
{
    public Controller2(EventNotifier eventNotifier)
    {
        eventNotifier.ImportantEvent += eventNotifier_OnImportantEvent;
    }

    private void eventNotifier_OnImportantEvent(object sender, EventArgs eventArgs)
    {
        OnEventNotifierImportantEvent(sender, eventArgs);
    }

    protected virtual void OnEventNotifierImportantEvent(object sender, EventArgs e)
    {
    }
}
4

1 に答える 1

5

コンストラクターでイベントを発生させないでください。これは、イベントを発生させるだけでなく、コンストラクターで任意の仮想メソッドを呼び出す場合にも当てはまります。その理由は、仮想メソッドは基本的にボトムアップで解決されるのに対し、オブジェクトはトップダウンでインスタンス化され、コンストラクターが実行されるためです。仮想メソッドのコードは簡単に見つかりますが、コンストラクターで呼び出された場合、最も派生した実装は、オブジェクトが完全にインスタンス化されていないため、まだ存在していない状態データに依存する可能性があります。

2 番目のオプションが行うことは、基本的に ReSharper のようなリファクタリング アシスタントを欺くため、「コンストラクターでの仮想呼び出し」に問題としてフラグを立てません。コンストラクターでの呼び出しは仮想ではなく、トレースするのに十分スマートでない限り (ほとんどはそうではありません)、カスケード仮想イベントに目をつぶることはありません。ただし、イベント (いずれか 1 つ) がコンストラクターから発生した場合は、まだ問題があります。

それを超えて、私が知っている問題はありません。

于 2012-11-20T23:56:50.090 に答える