2008-12-13 27 views
2

所以我已經開始用的FxCop玩弄最近一兩件事我注意到是它堅持認爲,附加到事件的任何方法應該是在形式帶有(object,EventArgs)參數的事件回調是否支持1.1和WinForms?

void Callback(object sender, EventArgs args) { ...} 

,並與

MyObject.Event += new EventHandler(Callback); 

現在,在.Net 1.1天內這一切都恢復良好,但從3.5開始,我發現只要進行類型爲Action或其泛型的事件調用就可以更輕鬆,更直觀,並且準確地編寫方法正如我明白地要求的那樣;沒有那個對象發件人或EventHandler cruft。

作爲一個問題,我認爲這是一個平面設計的必要條件。如果您爲事件回調設計了不同的方法,這意味着該方法至少隱含地包含了有關其調用的一些信息 - 這是一個主要的禁忌!

我完全願意接受我可能會錯過一些東西。你們對此有什麼想法,FxCop是錯的還是我?

回答

0

我不認爲FxCop已經在很長一段時間更新了;你有沒有使用VS2008代碼分析工具(FxCop的繼任者)來試用它?

1

你應該遵守約定。

  1. 使用通用事件處理<牛逼>,其中T是或EventArgs的派生。連接事件

    MyObject.SomeEvent + = new EventHandler <EventArgs>(SomeMethod);

  2. 事件處理程序方法應該返回void(將事物返回給事件提升者沒有意義),並且應遵循在事件參數中使用發件人對象和數據的約定。

理由「廢話」(發件人和EventArgs的)

  • 公約
  • 擴展更容易完成(無論是引發事件和處理它的類的類)
  • 有時你想知道誰發送了事件。
  • 任何/所有數據都可以封裝在 事件參數中。
  • 您可以使用 許多事件相同的事件處理程序。

該模式繼續進行。您還應該在名爲OnSomeEvent()的受保護方法中引發事件「SomeEvent」,以便您的類的派生類可以執行諸如抑制事件,以線程安全方式提升它們,在UI線程中引發它們,使用超時提高它們或異常保護,日誌事件引發進程等。

嘿,它不是一個完美的模式(也許發件人可能已被放入事件參數),但幾乎所有的.Net代碼都遵循它,框架代碼總是遵循它。爲什麼不遵循。

+0

約定 - 那麼?可擴展性 - 並不是那麼容易。知道調用者 - 可以是有用的,在這種情況下它可以是一個參數(強類型),它不應該是強制性的。它似乎是這樣存在的,因爲當時他們發明了它沒有泛型 – 2008-12-14 15:06:07

相關問題