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

时间:2009-06-02 23:51:48

标签: .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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

可能是因为事件调度程序通常被实现为委托,并且处理n个函数的语义都能够返回结果,至少可以说是icky。