3

我可以开始使用 CodeContracts 而不是:

if (XXX == Y)
    throw new ArgumentException("bla bla");

如果我开发一个库并且我的库用户不使用 CodeContracts,它是如何工作的?

4

3 回答 3

2

假设使用代码契约的代码是通过二进制重写器运行的,它会像您发布的代码一样抛出异常。重写者检查代码并用参数检查等替换合同代码。这有点像面向方面的编程。它会在您编译后注入代码来为您处理情况。

如果他们不使用代码合同,他们将无法获得执行静态分析的好处,该分析旨在查看合同并警告他们可能会根据合同及其代码收到错误。

代码合同

于 2010-12-20T15:08:46.283 回答
1

直截了当:可以写出这样的语句

Contract.Requires<ArgumentNullException>(argumentToCheck, "argumentToCheck");

如果在构建配置中启用运行时检查器,重写器会将这样的前置条件重写为普通的 ArgumentNullException。

代码的调用者将显示 ArgumentNullException 或您提供的任何异常,无论他们是否安装了代码合同。

于 2010-12-20T16:07:27.787 回答
0

我一直在使用代码合同,并用于临时用途,它们为我解决了 2 个之前没有好的解决方案的代码问题:

  • 检查返回值检查
  • 不变量似乎是一个名称不佳的组合参数检查/入口点和返回值/出口点断言。

我可以为返回值声明一个临时变量并在返回之前断言一些东西,但这是额外的摩擦。

检查参数已经有了解决方案:抛出 ArgumentException。

代码契约为 ArgumentException 添加了一个小东西——它让你很早就检查参数,在我看来这是一件好事。

代码合同还有很多事情要做,但我刚刚涉足,而且我没有进行超级全面静态检查的版本。我计划更全面地使用代码契约,一旦我这样做了——使用相同的框架检查参数会更优雅,而不是在代码契约和 if/then/throw ArgumentException 之间来回切换

于 2010-12-20T15:16:35.170 回答