gpt4 book ai didi

.net - 为什么 OnXXX 事件引发器方法不返回值?

转载 作者:行者123 更新时间:2023-12-02 09:01:25 25 4
gpt4 key购买 nike

假设您有一个使用 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

最佳答案

原因与.Net 中事件的实现有关。它们通常是 MulticastDelegate 类型,这意味着事件可以有多个订阅者。因此 RaiseEvent 调用会调用 N 个函数,其中 N 可以是 0、1 或 >1。只有在有 1 个订阅者的情况下,事件才可以按预期返回值。

如果是 0,CLR 应该返回什么?

如果>1,哪个代表应该获胜?我相信当前的实现决定了最后一位代表将获胜。但是如果第一个说取消但最后一个说不取消怎么办?事件参数是当前解决此差异的最佳方法。

关于.net - 为什么 OnXXX 事件引发器方法不返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/942469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com