2017-05-05 50 views
2

想象一下,我有一個具有按鈕的類(窗體/窗口)。在我的課堂我訂閱按鈕的方法,我把我自己的事件在它:觸發事件與發件人從下標事件或這?

public delegate void MyEventHandler(object source, MyEventArgs e); 
public event MyEventHandler MyEvent; 
protected virtual void OnMyEvent(MyEventArgs e) 
{ 
    if (this.MyEvent != null) this.MyEvent(this, e); 
} 

private void Button_Click(object sender, EventArgs e) 
{ 
    this.OnMyEvent(???, ???); 
} 

什麼是觸發我的事件的正確方法。我是否應該用我自己的EventArgs來使用this

this.OnMyEvent(this, new EventArgs()); 

或者我應該發送我的發件人和事件參數到我自己的事件訂閱?

this.OnMyEvent(sender, e); 

什麼是正確的方法。我們應該只堅持一種方法嗎?微軟如何做到這一點?任何代碼準則?

謝謝。

+0

取決於你的事件處理程序需要什麼。它是否需要按鈕上的eventargs?它需要新的事件嗎?或者它可能根本不需要eventargs,你可以從簽名中刪除它們? – Natrium

+1

參考 - https://msdn.microsoft.com/en-us/library/edzehd2t%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 – NoviceProgrammer

+0

@NoviceProgrammer所以MS使用'this'作爲發件人。 – modiX

回答

1

想想誰會訂閱你的活動。他們是否需要知道它是否來自按鈕?或者他們只需要知道它被解僱了?

就我個人而言,我更希望聽衆只知道事件被觸發,而發件人是我的課程,這使我可以自由地改變誰可以在第一個地方啓動事件,例如,按鈕點擊,計時器等。

+1

讓它取決於用戶的情況真的很好嗎?我更喜歡這個規則並堅持下去。由於'sender'始終是'object',所以不同的情況會導致混淆,不會呢? – modiX

+1

對不起,我不是指特定的用戶,而是任何用戶。我會保持一致並始終將發件人設置爲同一個對象,在這種情況下,它將是您定義MyEventHandler委託的類。 –

+0

這也是我相信的。我的事件是在'this'中定義的,它是* me *誰正在引發事件,即使按鈕事件觸發了*我*也這樣做。我已經和其他程序員交換了意見,並且發現了很多不同的意見。 – modiX