2010-12-02 7 views
5

多くのプロジェクトでイベントや代議員を使用していましたが、プロジェクトでイベントと代理人をどこで使うべきか疑問が残っています。 代理人とイベントの違いは何ですか?お願いします?イベントと代理人を使用する場所

+0

ここでうまく説明:http://blog.monstuff.com/archives/000040.html – SubniC

+0

イベントは単なるデリゲートの特別な形式です。 – VVS

+0

[イベントと代理人の違いとそれぞれのアプリケーション](http://stackoverflow.com/questions/563549/difference-between-events-and-delegates-and-its-respective-applications)の可能な複製 –

答えて

8

Delegateは、メソッド呼び出しをカプセル化できる型です。メソッドをオブジェクトとして扱い、それを渡す場合は、デリゲートを使用する必要があります。

Eventは、クラス外のコードでハンドラをアタッチできるが、デリゲートを呼び出せないプロパティとしてデリゲートを公開する単なる方法です。デリゲートをパブリックプロパティとして公開すると、クラス外のコードはハンドラをアタッチするだけでなく、デリゲートを呼び出すことができます。

さらに、イベントでは、ハンドラーが接続されたときに呼び出されるremoveメソッドを追加することもできます。これは、プロセスをより良く制御できるパブリックプロパティのgetterおよびsetterと同様です。

他のクラスをクラス内のイベントに登録し、発生したときに通知を受けるには、イベントを使用する必要があります。

public delegate void MyMessageHandlerType(string message); 

public class EventTest 
{ 
    public event MyMessageHandlerType MessageEvent 
    { 
     add { } // invoked when MessageEvent += SomeMethod 
     remove { } // invoked when MessageEvent -= SomeMethod 
    } 
} 
2

デリゲートとイベントの両方が、コールバックメカニズムを提供します。イベントは、という添付されたハンドラの数がである可能性があり、ハンドラの数に関係なくコードが同じ方法で動作することが多いという点で、デリゲートよりも多少接続の少ないコールバックメカニズムを提供します。良い例は、ウィンドウのResizedイベントです。ウィンドウのサイズ変更は、イベントハンドラが接続されているかどうかに関係なく動作します。イベントは通知メカニズムです。

代理人は、より多くの意味でより関連しています。通常、の1つのメソッドをデリゲートメンバーに関連付けます。しばしば期待されています。たとえば、LINQ拡張メソッド(Whereなど)を使用します。委任パラメータに1つのメソッドを指定しない限り機能しません。

関連する問題