为什么不让OnXXX事件提升器方法返回一个值?

Tim*_*phy 2 .net vb.net events

假设您有一个使用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
Run Code Online (Sandbox Code Playgroud)

对我来说似乎是一个比这更清洁的解决方案:

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
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 5

之所以与.Net中的事件实现有关.它们通常是MulticastDelegate类型,这意味着事件可以有多个订阅者.所以RaiseEvent调用调用N个函数,其中N可以是0,1或> 1.使事件返回值仅在有1个订户的情况下按预期工作.

在0的情况下,CLR应该返回什么?

在> 1的情况下,代表应该获胜?我相信目前的实施要求最后一位代表获胜.但如果第一个说取消但最后说不取消怎么办?事件参数是解决这种差异的当前最佳方法.