包含Contract.Assert是否对执行有影响?

时间:2013-08-21 12:16:41

标签: c# code-contracts

我见过包含Contract.Assert之类的代码,

Contract.Assert(t != null);

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

3 个答案:

答案 0 :(得分:4)

根据第11页的manual,它们仅在定义DEBUG符号时包含在您的程序集中(当然,它包括Debug版本,但不包括Release版本(默认情况下) ))。

答案 1 :(得分:1)

Contract.Assert的运行时优势外,您还可以考虑在调用遗留代码时使用Contract.AssumeManual第2.5节第11页)的替代方法。已定义合约,如果您希望将静态警告级别设置为高(例如静态检查级别more warningsall 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)

对于良好实践,最好进行一系列良好的单元测试。那么代码合同就没那么必要了。它们可能会有所帮助,但不那么重要。