2009-06-02 26 views
2

假設你有一個使用CancelEventArgs類引發事件的事件提升方法(OnXXX),讓OnXXX方法返回e.Cancel的值有什麼不妥?爲什麼不讓OnXXX事件提升方法返回一個值?

例如:

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

對我來說看起來很合理。 – supercat 2012-09-14 22:21:26

回答

1

大概是因爲事件調度程序通常實現爲代表和處理n個函數各自能夠語義返回一個結果,至少可以說是頑皮。

+0

但我沒有返回n個函數的值。我是n個函數後的EventsArgs中的值。 – 2009-06-03 04:23:54

+0

OnProcessingFile返回一個值(返回語句),確切地說,計算該值的方式是不相關的。 – 2009-06-03 11:41:10

5

之所以與.NET中的事件執行有關。它們通常是MulticastDelegate類型,這意味着可以有多個訂閱者。所以RaiseEvent調用調用N個函數,其中N可以是0,1或> 1。讓事件返回一個值只在有一個用戶的情況下按預期工作。

在0的情況下,CLR應該返回什麼?

在> 1的情況下,哪個代表應該贏?我相信目前的實施決定了最後一名代表將獲勝。但如果第一個說取消但最後一個說不取消呢?事件參數是解決這種差異的最好方法。

相關問題