2010-06-05 54 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进行自定义验证。