2014-03-12 20 views
2

讓我們假設我有類A和B.事件Func <bool>與2個處理程序:哪些返回期望?

在A類,我有以下事件:

public event Func<bool> MyEvent; 

和下面的方法:

public bool GetResult() 
{ 
    if (MyEvent!= null) 
     return MyEvent(); 
    else 
     return true; 
} 

而在B類,我有以下構造函數:

public B() 
{ 
    A a = new A(); 
    a.MyEvent += a_MyEvent_one; 
    a.MyEvent += a_MyEvent_two; 

    bool result = a.GetResult(); 
} 

private bool a_MyEvent_one() 
{ 
    return true; 
} 

private bool a_MyEvent_two() 
{ 
    return false; 
} 

因此,在B類的構造函數結束時期望結果如何,爲什麼?

回答

2

您將得到最近添加的句柄的結果。

話雖如此,你不應該依賴這種行爲。這就是爲什麼事件概念上不應該使用具有返回值的委託。即使行爲被定義了,大多數程序員也不會意識到它的作用,所以代碼會很混亂。程序員也可以改變處理程序被定義的順序,如果他們期望順序不重要(這通常是一個合理的假設)。

請注意,這僅適用於未定義自己的addremove方法的事件。自動實現將新的處理程序合併到一個MultiCastDelegate中,該代碼維護這個屬性。使用自定義方法的事件可以做任何想要的事情,並且它可以根據需要觸發事件,從而可以執行任意數量的事情,例如選擇不同的返回值來使用,使用所有返回值,等等。因此,如果在某個類中看到一個無法查看其源代碼的事件,則無法知道該屬性是否將被維護。你不知道它是否定義了自定義方法add/remove

1

調用多播委託將始終返回委託中最後一個方法的返回值。
在你的情況下,那將是false

相關問題