不包括合同.断言对执行有任何影响

本文关键字:任何 影响 执行 合同 断言 不包括 | 更新日期: 2023-09-27 18:28:39

我看到的代码包括类似Contract.Assert

Contract.Assert(t != null);

使用Contract.Assert会对我的生产代码产生负面影响吗?

不包括合同.断言对执行有任何影响

根据第11页的手册,只有在定义了DEBUG符号时,它们才会包含在程序集中(当然,它包括调试版本,但不包括发布版本(默认情况下))。

除了Contract.Assert的运行时优势外,如果您喜欢将静态警告级别调高(例如,静态检查级别more warningsall 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.Assertempirical运行时优势。

对于好的实践,最好有一组好的单元测试。那么代码合约就没有那么必要了。它们可能有帮助,但不那么重要。