5

イベントを実装するためのガイドラインを読んだすべての .NET 本で、EventArgsEventHandler をサブクラス化して使用する必要があると説明しています。http://msdn.microsoft.com/en-us/library/ms229011.aspxで詳細を調べたところ、「イベント ハンドラーとして使用する新しいデリゲートを手動で作成する代わりに、System.EventHandler を使用してください」と表示されています。EventArgs を使用する重要な理由があることは理解していますが、私の質問は「このようにすべきか」ではなく、「このようにすることができるか」です。

EventHandlerイベントで の代わりにジェネリック デリゲートを使用できない理由はありますか? たとえば、厳密に型指定された送信者が必要な場合 (他の誰かがそれに悩まされobject senderますか?) 。

私が言いたいことをよりよく説明するために、次のことがうまくいかない理由はありますか?

public class IoC
{
    public AbstractFactory GetAbstractFactory()
    {
        var factory = new AbstractFactory();
        factory.CreateObject += ()=>new object();
        return factory;
    }
}
public class AbstractFactory
{
    public event Func<object> CreateObject;

    private object OnObjectCreated()
    {
        if(CreateObject == null)
        {
            throw new Exception("Not injected.");
        }
        return CreateObject();
    }


    private object _injectedObject;
    public object InjectedObject
    {
        get
        {
            if(_injectedObject == null)
            {
                _injectedObject = OnObjectCreated();
            }
            return _injectedObject;
        }
    }
}
4

3 に答える 3

6

それは単なる慣習であり、言語の要件ではありません。任意のデリゲート タイプをイベントとして使用できます。

ただし、標準のEventHandler<T>署名にはいくつかの利点があります。

  1. パラメータを拡張できEventArgsます。イベントハンドラーに渡したいものごとに 1 つのパラメーターがある場合、これは機能しません。
  2. 基本クラスを受け入れる EventHandler はEventArgs、規則に従って任意のイベントをサブスクライブできます。
  3. EventHandler<T>すべてのイベントに表示される拡張メソッドを追加できます。
  4. 戻り型はvoid. 他の戻り値の型は、イベント ハンドラーとしてあまり意味がありません。
  5. あなたはコンベンションに従っています。やむを得ない理由がない限り、規則に従うことは通常は良い考えです。
于 2011-02-08T22:00:46.290 に答える
3

Microsoft のすべてのドキュメントは、基本クラス ライブラリの設計および/または一般的なフレームワーク設計ガイドラインに関するものです。好きなパターンを使用できます。

とはいえ、人々があなたのコードを使用する場合、Microsoft が使用するパターンに従えば、より親しみやすくなります。

于 2011-02-08T22:01:41.867 に答える
0

私の知る限り、EventHandler と EventArgs はベスト プラクティスですが、イベント宣言で任意のデリゲートを使用することを妨げるものは何もありません。event キーワードは、単一のデリゲートのみを受け入れるデリゲート型のフィールドまたはプロパティを単に持つのではなく、イベント スロットに += および -= デリゲートできるという特別な機能を提供します (複数のデリゲートを作成しない限り)。あなた自身)。

警告: イベント スロットで戻り値を持つデリゲートがどうなるかはわかりません。イベントに割り当てられた戻り値を持つ複数のデリゲートは処理が難しいため、戻り値は破棄されると思います。ただし、これにはいくつかの実験が必要です。

于 2011-02-08T22:03:39.790 に答える