我见过包含Contract.Assert
之类的代码,
Contract.Assert(t != null);
使用Contract.Assert
会对我的生产代码产生负面影响吗?
答案 0 :(得分:4)
根据第11页的manual,它们仅在定义DEBUG
符号时包含在您的程序集中(当然,它包括Debug版本,但不包括Release版本(默认情况下) ))。
答案 1 :(得分:1)
除Contract.Assert
的运行时优势外,您还可以考虑在调用遗留代码时使用Contract.Assume
(Manual第2.5节第11页)的替代方法。已定义合约,如果您希望将静态警告级别设置为高(例如静态检查级别more warnings
或all warnings
- 级别3+ - 并且Show Assumptions
已打开)。
Contract.Assume
为您提供与Contract.Assert
相同的运行时好处,但也会禁止因遗留程序集而无法验证的静态检查。
e.g。在下面的代码中,启用静态检查并将警告设置为级别3,在检查warning : CodeContracts: requires unproven: someString != null
MethodDoesNotAllowNull
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);
这样,您仍然可以在调试版本中获得empirical
的{{1}}运行时优势。
答案 2 :(得分:-1)
对于良好实践,最好进行一系列良好的单元测试。那么代码合同就没那么必要了。它们可能会有所帮助,但不那么重要。