代码合同 .net - 备选方案

Code contracts .net - alternatives

最近开始使用Code contracts for .net。代码契约本身的想法在我看来很棒,但实现起来却很不愉快。

我不喜欢它的主要原因是:

有没有缺陷更少的代码契约的高级替代品?

我不知道有什么替代方案,但我也许可以解决您的一些问题。我在一个团队中工作,该团队在我们所有的代码(~1000 个模块)中使用合同,并且 运行 对每次签入以及在 VS 中进行静态分析。

  • 代码丑陋。我们对(几乎)所有事物都有单独的接口,以及实现这些接口的抽象 类,由 ContractClass 和 ContractClassFor 属性连接。合同是抽象的ContractClassFor-classes,这使得实际的实现代码几乎没有代码合同。

  • 静态分析器速度慢通常是由于没有足够的契约,这迫使分析器做更多的工作来找出是否可以破坏契约。

  • 静态检查器错误警报。我有过一些,但还没有到成为问题的程度。同样,如果你的合约太少,静态检查器可能无法及时完成分析。

  • 可以使用这些 MSBuild 选项调试静态分析器运行缓慢,这将显示哪些方法花费最多的时间进行分析。

    msbuild myproject.sln /p:CodeContractsExtraAnalysisOptions="-show progress -stats=!! -stats slowMethods"

  • 如果您确定某些条件始终成立,那么您可以使用 Contract.Assume(条件) 指示静态检查器假定情况就是如此。例如

    Contract.Assume(mystring != null && mystring != "") 或者只是 Contract.Assume(!string.IsNullOrEmpty(mystring))

  • 关于 Debug.Assert 的使用,我认为进行静态检查而不是仅仅让我的应用程序在客户站点崩溃是一个巨大的优势。这样,我就可以在发布产品之前消除应用程序崩溃的风险。可能我理解错了,但我真的觉得你的比较没有意义。