我应该在.net 4.0的发布版本中打开代码契约的运行时检查吗?

本文关键字:代码 契约 检查 运行时 版本 net 布版本 我应该 | 更新日期: 2023-09-27 18:16:14

假设所有新的。net 4.0代码

我看到有一个选项可以打开它们。然而,我不知道什么是最佳实践?

最好的做法是,一旦静态检查完成,你真的不需要做运行时检查(因为编译器确保条件得到满足)?或者在某些情况下,即使编译器为您检查,仍然有可能在运行时不满足条件?

关于这个的任何好的在线讨论或文章。我看到很多人解释了如何做到这两者之一,但没有多少人解释了哪种是最佳实践,假设所有新的。net 4.0代码都不需要向后兼容。

我应该在.net 4.0的发布版本中打开代码契约的运行时检查吗?

,因为编译器确保满足条件?

静态验证器能够验证整个应用程序是非常罕见的。我们通常会满足于主要部分。

我应该打开运行时检查代码契约的。net 4.0的发布版本?

可能不是完整选项,而是一个较轻的选项,如仅预置条件

对于性能关键的代码,您可能希望完全关闭它们。

这取决于你使用require的方式。

如果你使用'Custom Contract Requires'模式:

public void SomeMethod(SomeClass x)
{
  if (x == null) throw new ArgumentNullException("x");
  Contract.EndContractBlock();
  ...
}

您可以安全地关闭运行时检查,并保留错误检查和异常

如果你使用'Standard Contract Requires'模式:

public void SomeMethod(SomeClass x)
{
  Contract.Requires<ArgumentNullException>(x != null);
  ...
}

您应该将运行时检查至少设置为'ReleaseRequires'级别。否则,你将失去所有的错误检查,并可能得到意想不到的异常(例如,NullReferenceException在代码深处,而不是ArgumentNullException在公共表面)

我不会使用更高级别的检查,原因很简单:如果Contract.Requires<E>以外的任何合约失败,运行时将抛出System.Diagnostics.ContractException,这可能不会让用户满意。

顺便说一句,Henk Holterman绝对正确,静态验证器是有限的,你不应该完全依赖它。