2014-04-03 149 views
0

我想知道C#如何解釋那段代碼。循環委託代碼

public delegate void ChangeStateHandler(object sender, EventArgs e); 
    public event ChangeStateHandler ChangeStateEvent = delegate { }; 

    protected void OnChangeState(EventArgs e) { 
     ChangeStateHandler ev = ChangeStateEvent; 

     ev(this, e); // <<<<< that LINE 
    } 

我知道這是部分翻譯成:

private EventHandlerList events = new EventHandlerList(); 
    private Object myeventObject = new object(); 
    public event EventHandler<EventArgs> myevent 
    { 
     add { events.AddHandler(myeventObject, value); } 
     remove { events.RemoveHandler(myeventObject, value); } 
    } 

在 「現實」 EV(這一點,E)怎麼翻譯? 我想是這樣的:

ChangeStateHandler ev = ChangeStateEvent; 
foreach (myHandler in ev) { 
    myHandler(this, e); 
} 

但是,如何一個單一的功能(EV)可以生成一個循環?以及如何實現類似的東西?

乾杯

+1

你基本上是問:「什麼是魔法由[多路廣播委託(http://msdn.microsoft.com /en-us/library/ms173175.aspx)可以調用連接到它們的多個處理程序?「編輯:我怎麼能推出我自己的多播委託或模仿類似的行爲? –

+0

很難理解你要求什麼。如果你想知道生成的CIL會怎麼樣,請使用反編譯器。 – Tarec

+0

@Chris:正好! – Kaiser69

回答

1

關閉 - 這是語義類似於:

foreach (ChangeStateHandler myHandler in ev.GetInvocationList()) { 
    myHandler(this, e); 
} 
+0

完美!有沒有辦法在我的代碼中實現這個「魔術」?調用一個函數,自動取消我的參數,並調用添加的對象列表? – Kaiser69

+0

@ Kaiser69我不明白這個問題;這不是魔術 - 那是可用的代碼 –

+0

heh。英語不是我的第一語言。這個魔術與myHandler()相關,它被透明地轉換爲>> foreach(bla bla)<<如何實現一個實現自動翻譯的函數?我只調用myFunction(myArgs)並循環遍歷myFunction中的項的東西{}? – Kaiser69