不包括合同.断言对执行有任何影响
本文关键字:任何 影响 执行 合同 断言 不包括 | 更新日期: 2023-09-27 18:28:39
我看到的代码包括类似Contract.Assert
的
Contract.Assert(t != null);
使用Contract.Assert
会对我的生产代码产生负面影响吗?
根据第11页的手册,只有在定义了DEBUG
符号时,它们才会包含在程序集中(当然,它包括调试版本,但不包括发布版本(默认情况下))。
除了Contract.Assert
的运行时优势外,如果您喜欢将静态警告级别调高(例如,静态检查级别more warnings
或all warnings
-级别3+-和Show Assumptions
打开),在调用未定义契约的遗留代码时,还可以考虑使用Contract.Assume
(手册第2.5节,第11页)。
Contract.Assume
为您提供了与Contract.Assert
相同的运行时好处,但也抑制了由于遗留程序集而无法验证的静态检查。
例如,在下面的代码中,启用静态检查并将警告设置为级别3的情况下,在检查MethodDoesNotAllowNull
的合同时会给出warning : CodeContracts: requires unproven: someString != null
var aString = Legacy.MethodWithNoContract();
MethodDoesNotAllowNull(aString);
private void MethodDoesNotAllowNull(string someString)
{
Contract.Requires(someString != null);
}
带有旧装配代码:
public static string MethodWithNoContract()
{
return "I'm not really null :)";
}
Assume
抑制警告(但在调试构建中提供运行时断言优势):
var aString = LegacyAssembly.LegacyMethodWithNoContract();
Contract.Assume(aString != null);
MethodDoesNotAllowNull(aString);
这样,您仍然可以在调试构建中获得Contract.Assert
的empirical
运行时优势。
对于好的实践,最好有一组好的单元测试。那么代码合约就没有那么必要了。它们可能有帮助,但不那么重要。