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