相关疑难解决方法(0)

事件Action <> vs event EventHandler <>

声明event Action<>和声明之间有什么不同吗event EventHandler<>

假设实际引发事件的对象无关紧要.

例如:

public event Action<bool, int, Blah> DiagnosticsEvent;
Run Code Online (Sandbox Code Playgroud)

VS

public event EventHandler<DiagnosticsArgs> DiagnosticsEvent;

class DiagnosticsArgs : EventArgs
{
    public DiagnosticsArgs(bool b, int i, Blah bl)
    {...}
    ...
}
Run Code Online (Sandbox Code Playgroud)

两种情况下的使用情况几乎相同:

obj.DiagnosticsEvent += HandleDiagnosticsEvent;
Run Code Online (Sandbox Code Playgroud)

关于event EventHandler<>模式,有几件我不喜欢的事情:

  • 从EventArgs派生的额外类型声明
  • 强制传递对象来源 - 通常无人问津

更多代码意味着维护更多代码而没有任何明显的优势.

结果,我更喜欢 event Action<>

但是,只有在Action <>中有太多类型参数时,才需要额外的类.

c#

132
推荐指数
7
解决办法
9万
查看次数

.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的子类会出什么问题?这是一个常规和程序员期望的问题,还是有一些微妙的技术原因必须遵循这种模式?我说微妙,因为代码似乎工作正常.

.net

4
推荐指数
1
解决办法
355
查看次数

点击了哪个控件?

我的WinForm C#应用程序上的MouseEvents有问题.我希望鼠标点击我的应用程序.如何确定点击了哪个控件?(我是初学者C#)

c# winforms

1
推荐指数
1
解决办法
7860
查看次数

标签 统计

c# ×2

.net ×1

winforms ×1