2013-02-27 78 views
6

基本上标题说什么。 请告诉我(我目前使用第一个)私人EventHandler和私人事件EventHandler之间的区别?

private EventHandler _progressEvent; 

private event EventHandler _progressEvent; 

我有一个方法这两个之间的差

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

的doDownload方法将调用

_progressEvent(this, new EventArgs()); 

到目前为止它工作正常。但我觉得我正在做一些可怕的错误。

回答

8

第一个定义了一个委托,第二个定义了一个事件。两者是相关的,但它们通常使用的方式非常不同。

一般来说,如果您使用的是EventHandlerEventHandler<T>,则表示您使用的是事件。来电者(用于处理进度)通常会认购(未通过委托),如果您拥有订阅者,则会提出该事件。

如果你想使用更多功能的方法,并传入一个委托,我会选择一个更合适的委托使用。在这种情况下,你并不是真的在EventArgs中提供任何信息,所以也许只是使用System.Action会更合适。

这就是说,事件方法在这里显示更合适,从所示的小代码。有关使用事件的详细信息,请参见C#编程指南中的Events

你的代码,使用事件,很可能是这个样子:

// 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); 
+0

我想我真的不需要真实的事件,因为我只会有1个订阅者,我需要通过周围的代表。感谢您的回应。 – 2013-02-27 18:33:03

1

我不认为两者有区别。

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 +=) 
//can 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