6

基本的にはタイトルの通り。これら2つの違いは何ですか(私は現在最初のものを使用しています)

private EventHandler _progressEvent;

private event EventHandler _progressEvent;

方法があります

void Download(string url, EventHandler progressEvent) {
    doDownload(url)
    this._progressEvent = progressEvent;
}

doDownload メソッドは、

_progressEvent(this, new EventArgs());

これまでのところ、問題なく動作します。しかし、私はひどく間違ったことをしていると感じています。

4

2 に答える 2

8

1つ目はデリゲートを定義し、2つ目はイベントを定義します。この2つは関連していますが、通常は非常に異なる方法で使用されます。

一般に、EventHandlerまたはを使用している場合EventHandler<T>、これはイベントを使用していることを示します。発信者(進行状況を処理するため)は通常、イベントをサブスクライブし(デリゲートを渡さない)、サブスクライバーがいる場合はイベントを発生させます。

より機能的なアプローチを使用し、デリゲートを渡す場合は、使用するより適切なデリゲートを選択します。この場合、実際にはで情報を提供していないEventArgsので、おそらく単に使用System.Actionする方が適切でしょう。

そうは言っても、ここに示されている小さなコードから、イベントアプローチがより適切であるように見えます。イベントの使用の詳細については、 『C#プログラミングガイド』の「イベント」を参照してください。

イベントを使用したコードは、次のようになります。

// This might make more sense as a delegate with progress information - ie: percent done?
public event EventHandler ProgressChanged;

public void Download(string url)
{ 
  // ... No delegate here...

あなたがあなたの進歩を呼ぶとき、あなたは書くでしょう:

var handler = this.ProgressChanged;
if (handler != null)
    handler(this, EventArgs.Empty);

これのユーザーはこれを次のように書きます:

yourClass.ProgressChanged += myHandler;
yourClass.Download(url);
于 2013-02-27T18:21:46.943 に答える
4

の場合private、両者に違いはありませんが、public使用したい場合がありますevent

event キーワードは、private internal や protected などのアクセス修飾子です。マルチキャスト デリゲートへのアクセスを制限するために使用されます。https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/event

私たちが持っている最も目に見えるものから最も目に見えないものへ

public EventHandler _progressEvent;
//can be assigned to from outside the class (using = and multicast using +=)
//can be invoked from outside the class 

public event EventHandler _progressEvent;
//can be bound to from outside the class (using +=), but can't be assigned (using =)
//can only be invoked from inside the class

private EventHandler _progressEvent;
//can be bound from inside the class (using = or +=)
//can be invoked inside the class  

private event EventHandler _progressEvent;
//Same as private. given event restricts the use of the delegate from outside
// the class - i don't see how private is different to private event
于 2015-06-11T10:17:12.683 に答える