2011-02-08 18 views
5

イベントの実装のガイドラインを読んだすべての.NETブックでは、EventArgsをサブクラス化してEventHandlerを使用する必要があることが説明されています。私はhttp://msdn.microsoft.com/en-us/library/ms229011.aspxの詳細を調べて、 "新しいハンドラを手動で作成してイベントハンドラとして使用する代わりに、System.EventHandlerを使用してください"と述べています。 EventArgsを使用する重要な理由があることを理解していますが、私の質問は「私はそれをこのようにするべきか」ではなく、「このようにすることはできますか?」です。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; 
     } 
    } 
} 
+0

私はこれを、観測可能なコレクションに類似したものを実装するために正確に行ってきました。 – asawyer

+0

関連スレッド:http://stackoverflow.com/questions/4828212/should-eventhandler-always-be-used-for-events/4828233 – CodesInChaos

答えて

5

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

標準EventHandler<T>署名は、しかし、いくつかの利点があります:あなたはEventArgsパラメータを拡張することができ

  1. 。これは、イベントハンドラに渡す1つのパラメータごとに1つのパラメータがある場合は機能しません。 EventArgs基本クラスを受け入れ
  2. アンEventHandlerは、あなたはすべてのイベントに表示されEventHandler<T>に拡張メソッドを追加することができ大会
  3. 、次のいずれかのイベントをサブスクライブすることができます。
  4. 戻り値の型はvoidです。他の戻り値の型は、イベントハンドラとしてはあまり意味がありません。
  5. あなたは規約に従っています。あなたが賛成できない議論をしていない限り、大会に続いて良いアイディアがあります。
3

Microsoftのドキュメントはすべて、基本クラスライブラリの設計や一般的なフレームワーク設計のガイドラインに関するものです。あなたはどんなパターンを使ってもかまいません。

言い換えれば、人々があなたのコードを消費する場合、マイクロソフトが使用するパターンに従えば、より慣れ親しんでいるでしょう。

0

私が知る限り、EventHandlerとEventArgsはベストプラクティスですが、イベント宣言で任意のデリゲートを使用するのを止めることはできません。 eventキーワードは、デリゲートタイプのフィールドまたはプロパティを単に持つのではなく、+ =と - =をイベントスロットに委譲できる特別な機能を提供します。複数のデリゲートを作成しない限り、あなた自身)。

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

+0

最後の値が返されます。しかしそれはまったく役に立たない。 –