.NET事件的签名

Eri*_* J. 4 .net

可能重复:
为什么C#中的事件需要(sender,EventArgs)?

我刚刚在一个项目上运行VS2012代码分析工具,发现它抱怨这个代码片段:

public delegate void PerMbHandler(long totalMb);

public event PerMbHandler NotifyMegabyteIncrement;
Run Code Online (Sandbox Code Playgroud)

CA1009将"MyWebClient.PerMbHandler"的第二个参数声明为EventArgs,或者是一个扩展EventArgs的类型的实例,名为"e".

MSDN解释说:

事件处理程序方法有两个参数.第一个是System.Object类型,名为"sender".这是引发事件的对象.第二个参数是System.EventArgs类型,名为"e".这是与事件关联的数据.例如,如果在打开文件时引发事件,则事件数据通常包含文件的名称.

MSDN简单地说明了约定是什么,而不是它存在的原因.

使用long参数而不是EventArgs的子类会出什么问题?这是一个常规和程序员期望的问题,还是有一些微妙的技术原因必须遵循这种模式?我说微妙,因为代码似乎工作正常.

Tim*_*ora 5

使用long参数而不是EventArgs的子类会出什么问题?

事件Args
本身并没有错,但它不可扩展.为了争论,也许在6个月内你需要传递两个长片,或者添加一个字符串,或者添加一整套信息.随着EventArgs在签名中,你可以通过任何派生类型,而不是破坏现有的消费者; 具有特定值类型,您非常有限.

EventArgs还允许您与引发事件的类进行通信,例如CancelEventArgs.

发件人
老实说,我很少使用发件人做任何事情.它也可能有些含糊不清.例如,通过输入文本框触发的控件上的自定义事件...谁是发件人?文本框(可能更有用),或声明自定义事件的控件?

尽管如此,这是一个熟悉的惯例,并且有一个记录良好的界面,它可能是有用的.

  • 当您将相同的事件处理程序代码附加到许多不同的项目时,sender很有用. (2认同)