首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >private EventHandler和private event EventHandler之间的区别?

private EventHandler和private event EventHandler之间的区别?
EN

Stack Overflow用户
提问于 2013-02-28 02:17:22
回答 2查看 4.3K关注 0票数 6

基本上就是标题所说的。这两个有什么区别(我现在用的是第一个)

代码语言:javascript
复制
private EventHandler _progressEvent;

代码语言:javascript
复制
private event EventHandler _progressEvent;

我有一个方法

代码语言:javascript
复制
void Download(string url, EventHandler progressEvent) {
    doDownload(url)
    this._progressEvent = progressEvent;
}

doDownload方法将调用

代码语言:javascript
复制
_progressEvent(this, new EventArgs());

到目前为止,它工作得很好。但我觉得我正在做一件可怕的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-28 02:21:47

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

通常,如果您使用的是EventHandlerEventHandler<T>,这将暗示您使用的是事件。调用者(用于处理进度)通常会订阅事件(而不是传递委托),如果您有订阅者,则会引发事件。

如果你想使用一种更函数化的方法,并传入一个委托,我会选择一个更合适的委托。在这种情况下,您实际上并没有在EventArgs中提供任何信息,所以可能只使用System.Action会更合适。

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

使用事件的代码可能如下所示:

代码语言:javascript
复制
// 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...

当你调用你的进度时,你会这样写:

代码语言:javascript
复制
var handler = this.ProgressChanged;
if (handler != null)
    handler(this, EventArgs.Empty);

这样的用户可以这样写:

代码语言:javascript
复制
yourClass.ProgressChanged += myHandler;
yourClass.Download(url);
票数 8
EN

Stack Overflow用户

发布于 2015-06-11 18:17:13

对于private,这两者没有区别,但是对于public,您可能希望使用event

事件关键字是一个访问修饰符,如private、internal和protected。它用于限制对多播委托的访问。https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/event

从最明显的到最不明显的

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15119323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档