2017-09-02 94 views
1

我想創建一個列表來存儲一些事件並通過列表將事件處理程序附加到事件。將事件處理程序附加到存儲在列表中的事件

所以我做一個List<dele>添加事件anEvent進去,然後我試圖將事件處理程序附加到該事件,但最後anEvent仍然有連接到它的節目輸出真沒有事件處理程序。但存儲在list[0]的代表確實獲得了lambda表達式。

public delegate void dele(); 

class Program 
{ 
    static event dele anEvent; 
    static void Main(string[] args) 
    { 
     List<dele> list=new List<dele>(); 
     list.Add(anEvent); 
     list[0]+=()=>{Console.WriteLine("BEEP!");}; 
     Console.WriteLine(anEvent==null); 
    } 
} 

是不是委託引用類型?看來eventhandlerlist[0]是指不同的對象。我想知道爲什麼。

如果我想anEvent獲取事件處理程序時,我將處理程序附加到list[0],我該怎麼辦?

謝謝!

+0

_The方案產出'True'_不確定??? – TaW

+1

輸出是假的我測試了它 –

+0

代表是值類型。 – Enigmativity

回答

0

委託基本上是一個方法實現的合同。有點像界面是類實現的契約。

CLI(公共語言基礎結構)規範說delegates are reference types

委託是一種引用類型,可用於封裝指定的 或匿名方法。委託類似於 C++中的函數指針;然而,代表是類型安全的和安全的。對於 代表的應用程序,請參閱代表和常規代表。

看看this的問題,也看看that一。

我已轉換的方法成非匿名方法用於調試的原因

public delegate void dele(); 
public static event dele anEvent; 

    static void Main(string[] args) { 
     List<dele> list = new List<dele>(); 
     list.Add(anEvent); 
     list[0] += Dele; 
     list[0].Invoke(); //this actually gets invoked and does not throw! 
     anEvent = list[0]; 
     Console.WriteLine(anEvent == null); //the output is false 
     anEvent.Invoke(); // this also gets s invoked and does not throw 
    } 

private static void Dele() { //this gets invoked 2 times as expected 
    Console.WriteLine("Beep"); // this gets printed after invoking the event 
} 
+0

我很抱歉。語句anEvent = list [0];不應該在那裏。我刪除它。然後輸出將是嗶聲和真實的。這意味着一個事件沒有得到刪除和列表[0]得到了,我認爲它是正確的?但爲什麼?委託是引用類型,那麼爲什麼list [0]和anEvent獲得不同的值? –

+0

我想我明白了。所以當我將'anEvent'傳遞給'List.Add'方法時,它實際上覆制了事件中的委託,然後我將一個事件處理程序附加到存儲在'list [0]'中的委託中,因爲委託是一個不可變類型它不會影響'anEvent'中的委託,因此它不起作用。是對的嗎? –

相關問題