通过合同进行静态检查设计

时间:2009-07-23 05:04:20

标签: c# .net mono

我最近对.net 4.0 / Visual Studio 2010中按合同进行静态检查设计的想法感到兴奋。

但是我很遗憾地发现它只能在Visual Studio Team System中使用。 http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx

是否有任何替代方案可以通过合同对c#进行静态检查设计?

单声道项目是否会将这种功能性添加到编译器中?

2 个答案:

答案 0 :(得分:3)

他指的是定理证明。

没有什么可以阻止开源或商业社区实施自己的。合同类是BCL的一部分,很容易添加到Mono中。如果我们想静态检查事物,“我们”需要制定一个定理证明器。

证明者不是编译器的一部分。它主要运行如下:

  • 编译定义了CONTRACTS_FULL的二进制版本。这将发出所有Contract属性并调用Contract类静态方法。
  • 加载程序集“仅用于反射”,并解析所有方法的字节代码。具有状态信息的详细流量分析将允许某些合同“始终为真”。有些人会“在某些时候被称为假”。其他人将“无法静态证明合同。”

随着工具变得更好,它将从对每个合同发出警告,最终向Microsoft版本提供类似的证明结果。

编辑:伙计,如果Reflector是开源的,那将是非常好的。第一遍实现当然可以作为插件运行。这样,可以设计证明器逻辑而不必担心如何加载二进制文件。一旦它证明了功能(得到它?),逻辑可以被提取和构建,以操作由另一个程序集加载器(一个是开源的)生成的语法树。这里重要的/新颖的是证明器逻辑 - 装配装载器已经多次完成,没有任何变化可以用于此用途。

答案 1 :(得分:0)

代码协定不需要C#编译器,因为它们是作为.NET Framework 4.0中的类实现的。任何可以发出托管程序集的.NET编译器都是可用的,尽管在混合托管代码和本机代码时C ++ / CLI可能会发出不兼容的程序集。

IDE还执行了其他工具来重写生成的IL,以便合同显示在正确的位置,因此Mono项目作者需要为Mono平台上的合同编写类似的工具。

有关详细信息,请参阅this post