假设你有一个使用CancelEventArgs类引发事件的事件提升器方法(OnXXX),让OnXXX方法返回e.Cancel的值有什么问题吗?
例如:
Public Sub ProcessFiles(folder as DirectoryInfo)
For each file in folder.GetFiles()
If OnProcessingFile(New FileEventArgs(file)) Then
.....ProcessFileCode
Else
Exit For
End If
Next
End Sub
Protected Function OnProcessingFile(ByVal e As FileEventArgs) As Boolean
RaiseEvent ProcessingFile(Me, e)
Return Not e.Cancel
End Function
对我而言似乎是一个比这更清洁的解决方案:
Public Sub ProcessFiles(folder as DirectoryInfo)
Dim e As FileEventArgs
For each file in folder.GetFiles()
e = New FileEventArgs(file)
OnProcessingFile(e)
If e.Cancel Then
Exit For
End If
.....Process File Code
Next
End Sub
答案 0 :(得分:5)
之所以与.Net中的事件实现有关。它们通常是MulticastDelegate类型,这意味着事件可以有多个订阅者。所以RaiseEvent调用调用N个函数,其中N可以是0,1或> 1。使事件返回值仅在有1个订户的情况下按预期工作。
在0的情况下,CLR应该返回什么?
在> 1的情况下,代表应该获胜?我相信目前的实施要求最后一位代表获胜。但如果第一个说取消但最后说不取消怎么办?事件参数是解决这种差异的当前最佳方法。
答案 1 :(得分:1)
可能是因为事件调度程序通常被实现为委托,并且处理n个函数的语义都能够返回结果,至少可以说是icky。