簡體   English   中英

事件參數; “發件人為對象”,或“發件人為T”?

[英]Event parameter; “sender as Object”, or “sender as T”?

當我為業務對象編寫公共事件時,除了附加的特定參數之外,我還習慣於將實例作為“ sender as Object ”傳遞。 我現在問自己為什么不指定課程

所以對你有更多的經驗; 您是否曾在活動中將不同的類作為發件人傳遞 如果是這樣,那么當你可以/不好的時候,你的決定標准是什么?

不要太極端。 EventHandler(object sender, EventArgs e)有一個對象發送者,因此我們可以在很多情況下使用它。 但這並不意味着一個強類型的發送者是邪惡的。 當這個委托不被廣泛使用時(例如EventHandler ),強類型發送器很有用

public delegate void SaveHandler(Controller sender, EventArgs e);

現在,其他開發人員(或使用你的庫的人)可以認識到發件人必須是一個Controller ,他們很樂意不這樣編碼:

public void MySaveHandler(object sender, EventArgs arg)
{
   var controller = sender as Controller;
   if (controller != null)
   {
       //do something
   }
   else
   {
       //throw an exception at runtime? 
       //It can be avoided if sender is strongly-typed
   }
}

你甚至可以把它變成通用的:

public delegate void SaveHandler<T>(T sender, EventArgs args) 
                                              where T: IController;

這是C#的純法律和良好實踐。 你應該明確你想做什么,然后選擇更好的方法。 他們中的任何一個都是邪惡的。

有一個設計指南 ,指定事件處理程序應該有兩個參數:sender(一個Object)和e(EventArgs或從中派生)。

沒有這樣的限制。 它只是整個BCL(基類庫)和其他流行框架遵循的指導原則。

如果它將被其他開發人員使用或作為框架發布,我建議您遵循它以保持一致。

據我看到它,你可以創建你想要的參數代表,然后創建一個使用該委托的事件,然后你可以調用事件和傳遞的參數,也可以使用自定義事件參數如圖所示這里 正如另一個答案所示。 保持一致。

沒有真正回答您關於決策標准的問題,但希望它有所幫助

我目前的理念是盡可能使代碼實踐盡可能接近標准的Microsoft方式。 你從這里得到兩件事:

  • 新開發人員可以快速了解您的代碼
  • 您培訓現有開發人員如何使用框架的其余部分

最好使用object sender, EventArgs e簽名,因為該方法可以處理該簽名的任何事件。 例如,在使用圖表控件的項目中,有幾種類型的MouseOver事件 - 來自DataSeries ,來自Legend,來自整個Canvas。

這樣,您可以處理事件的任何來源,因為在大多數情況下,信息都在EventArgs

此外,您不必在將代理傳遞給委托時強制轉發,因為任何類實例都是內部對象。

不久前在StackOverflow上就相關問題進行了大量討論。 這是一個問題: .NET中的事件簽名 - 使用強類型發件人

最終,它歸結為偏好。 在大多數情況下,您希望將事件處理程序綁定到特定類型的類,這樣使發件人成為一個對象,然后回滾到該類以便訪問其屬性可能不會很好地與您[它也不適合我。

此外,使用.NET 3+以及委托協方差和逆變的引入,使用強類型委托應該不是問題。 我必須承認,我在代碼中多次使用強類型事件處理程序。

就像我之前說的那樣,它取決於偏好; 微軟剛剛發布了一套引導線而非規則......

擁有這樣的實現對你沒有約束力。 它通常是因為EventHandler 委托設計了這樣的原型。

它是一個簡單的指南,后面是基類庫。 但是你可以確保自己擁有參數和實現。

但請記住,如果某些開發人員使用它,他將需要了解此類實現。 無論在哪個級別使用,它都能提供更好的靈活性和靈活性。

如果您為事件定義自定義原型 ,那么我建議您還定義自定義委托 ,以確保如果未傳遞正確的類型,您將捕獲異常 (如果需要,用戶需要進行顯式演員)

像這樣:

public delegate void MyEventHandler( MyType sender, EventArgs e);

然后在需要時使用它:

this.MyEvent += new MyEventHandler(my_eventhandlerfunction);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM