2012-03-01 11 views
2

クラスがそのメソッド内のイベントを発生させる場合、そのクラスは何がイベントにサブスクライブするかを知る必要はありません。また、加入者がいる場合は重要ではありません。サブスクライバを持たない可能性のあるイベントの処理

OnTriggerイベントのサブスクライバが存在しない場合、例外が発生します。

public class EventTrigger 
{ 
    public static void Main(string[] args) 
    { 
     (new EventTrigger()).Trigger(); 
    } 

    public delegate void Delegate1(); 
    public event Delegate1 OnTrigger; 

    void Trigger() 
    { 
     OnTrigger(); 
    } 
} 

私はこのようなイベントを呼び出すことができます。

​​

しかし、誘因者がサブスクリプションについて知る必要はないので、それは私にとっては不思議なようです。

私の質問は:

は、私はそれを使用するたびにイベント参照がnullであるかどうかを確認する必要があります。

+1

トピックに関する興味深い議論があります:http://stackoverflow.com/questions/248072/evil-use-of-extension-methods – ken

+0

私は宇宙で一人ではありません。それは私の気持ちを良くする。しかし、私はそれも良いアプローチではないと思う。それは拡張メソッドによって行われるためではありません。それはまた、より多くのキーボード入力を必要とし、より汚れてしまうからです。 –

答えて

2

OnTriggerを初期化する場合は、チェックする必要はありません。例:

public event Action OnTrigger = delegate { }; 

はい'delegateは{} 'これはあなたがチェック'null'省略することができます理由である、新しいオブジェクトをインスタンス化します。

'delegateは{} 'あなたはそれが(Delegate1は、文字列を返す場合に必要)文字列を返すようにしたいならば、あなたは、単に'returnを追加して「」、何も返さない;'例:

public event Action OnTrigger = delegate { return string.Empty; }; 

私が追加しなければならないことは、ヌルチェックを避けるためにこれを行うことは悪い習慣であるということです。一部のコードでもイベントをnullに設定できますが、 'OnTrigger = null'はコードを破損します。そして、それが直列化になると、それはまったく動作しません。

+0

ありがとうございます。私には2つの質問があります: 1st。 "委任{};"オブジェクトを初期化するか?それは何を返すのですか? 2nd。どのように値を返すデリゲートを処理できますか?このように: パブリックデリゲートの文字列Delegate1(); パブリックイベントDelegate1 OnTrigger = delegate {}; –

+0

私は答えを – Terkel

+0

更新しました空のサブスクライバを含めるようにイベントを初期化するのはやや難しいです。 'Delegate.Combine'と' Delegate.Remove'はデリゲートを何も追加しない、彼らは他のシナリオを扱っており、 'Delegate.Invoke'は結合されていないデリゲートを処理するオーバーヘッドが少なくなります(ヌルデリゲートの呼び出しをスキップすることはダミーのものを呼び出すより速い)。予想される加入者数が1より大きい場合、空の代理人を追加することはあまり悪くないかもしれませんが、最大でも1人の加入者が期待される場合は無駄です。 – supercat

1

トリガーは個々のサブスクライバについて知る必要はありませんが、サブスクリプションについて知る必要があります。毎回ヌルチェックを行うか、Simonの回避策を使用する必要があります。

関連する問題