2010-06-05 53 views

回答

20

這是一種複雜的請求,說實話,它可能會根據偏好而不同。但是,這是我的理解:

  • 性能:幾乎每一次例外會失去,除非你的其它實現是可怕的。投擲/捕捉週期有很大的開銷。 (軼事:我有一個'必須是數字'的檢查,這是一個例外,它在用戶界面失敗時「滯後」了一段顯着的時間,但是當轉換爲ValidationRule時,它是有效的。)
  • 內存泄漏:這取決於您的驗證規則或IDataErrorInfo實現如何完成。
  • 代碼維護,重用:當然這是一個有趣的部分。你真正應該問的是「什麼時候使用ValidationRule而不是IDataErrorInfo?反之亦然?」

ValidationRules比IDataErrorInfo還舊(我相信後者是在.NET 3.5中引入的)。僅憑這一點,似乎WPF團隊更喜歡IDataErrorInfo。但事實是,他們是爲不同的事情而建造的。如果您有MVVM或等效模式,那麼IDataErrorInfo在模型(例如負數年齡)中的錯誤優於錯誤,而驗證規則在視圖(例如,年齡爲1/8)中的錯誤優越。當然可以讓ValidationRules執行「業務邏輯」檢查,或讓IDataErrorInfo告訴你「unicode雪人不是一個有效的年齡」,但是你可能(可能)通過保持這種模式來獲得最佳的可維護性。

但是,除了初始測試之外,不要使用異常進行驗證,以查看您應該測試的確切條件。

+4

今天讀到了IDataErrorInfo - 看起來比ValidationRule早 - 看起來IDataErrorInfo接口自Framework 1.1以來一直存在(http://msdn.microsoft.com/zh-cn/library/system.componentmodel.idataerrorinfo_properties (v = VS.71).aspx),但自Framework 3.0以來的ValidationRule。不要認爲它從根本上改變了你的答案 – GrahamMc 2011-10-03 16:18:04

3

使用異常進行錯誤處理不是個好主意。使用異常會降低性能。這是選擇和實現IDataErrorInfo或創建驗證規則的問題。

IDataErrorInfo的

  • 驗證邏輯保持視圖模型,易於實現和維護
  • 完全控制在視圖模型所有領域

驗證規則

  • 在單獨的類中維護驗證規則
  • 提高可重用性。例如,您可以實現所需的字段 驗證類在整個應用程序中重用它。

我的意見是,對於常見驗證,如需要的字段驗證,電子郵件地址驗證您可以使用驗證規則。如果您需要執行自定義驗證(如範圍驗證),或者使用IDataerrorinfo進行自定義驗證。