![](/img/trans.png)
[英]In a C# event handler, why must the “sender” parameter be an object?
[英]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.