我应该在.net 4.0的发布版本中打开代码契约的运行时检查吗?
本文关键字:代码 契约 检查 运行时 版本 net 布版本 我应该 | 更新日期: 2023-09-27 18:16:14
假设所有新的。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绝对正确,静态验证器是有限的,你不应该完全依赖它。