System.Action <T>作为EventHandler [duplicate]

问题描述

|                                                                                                                   这个问题已经在这里有了答案:                                                      

解决方法

好吧,您提供的代码不是线程安全的-有人可以在您的无效性测试之后且在调用“ 0”之前取消订阅事件处理程序。 但总的来说,它应该可以正常工作。不利之处在于,不遵循ѭ1约定,您可以订阅的内容就会受到更多限制。 例如,假设您有一个非常通用的事件处理程序方法:
public void LogEvent(object sender,EventArgs e)
{
    Console.WriteLine(\"Event raised\");
}
您可以使用它来订阅遵循常规约定的任何事件-但不能使用 您的活动。 不过,这是一个相当小的缺点。我猜可能更大的一个是,它可能会使希望看到常规事件签名的其他开发人员感到困惑。 编辑:我刚刚记得,其他一些库可能希望使用常规的事件签名-例如,Reactive Extensions确实可以。 IIRC,订阅其他事件不是没有可能,只是要困难一点。     ,从“代码工作”的角度来看,我想将这些委托类型用于事件是完全可以的。 这样做的问题是,您没有遵循事件的通用模式,即委托为
EventHandler<TEventArgs>
,并且TEventArgs是包含事件参数的自定义类型。遵循此模式的好处包括: 代码可读性 如果您需要向事件中添加参数,则不必更改事件订阅者(因为您只需将其添加到自定义事件参数类中即可)。     ,一般来说: 使用ѭ4作为事件处理程序没有问题。它受语言支持,请使用它:) 我能想到的唯一情况是尝试通过反射查找事件的代码。但是,如果该代码无法将任何委托作为事件类型进行处理,那么我会说他们的代码是错误的,而不是您的。 您的具体示例: 您正在使用的模式的问题在于,在使用
Dispose
方法时,您实际上不应使用该对象。有时可能很安全,但很容易出错。 例如,如果“ 5”方法在引发事件之前已分配资源,则该对象将处于无法使用的状态。 对于维护程序员来说,在编辑
Dispose
方法时,这可能很难(没有注释和强大的代码审查)。