问题标签 [code-contracts]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1902 浏览

msbuild - 有没有办法不让 MsBuild 使用代码合约运行静态合约分析?

在我的项目中,静态检查被禁用,但是,当我使用 cmd 运行 msbuild.exe 时,它​​会开始对每个项目进行静态检查......有没有办法通过参数禁用它?

0 投票
1 回答
5500 浏览

c# - 我是否错误地执行了这个简单的合同?

这是我的代码:

我已尝试使用Contract.RequiresContract.Invariant方法来防止 vertexCount 变量小于或等于 2;但是我仍然可以初始化具有 2 个或更少边的 RegularPolygon。我的(简化的)NUnit 测试如下所示:

上面的测试也通过了,我不知道为什么!

起初我认为 ReSharper 可能搞砸了,因为每当我尝试使用Contract命名空间中的方法时,它会使该行变灰并显示此消息:

方法调用被跳过。编译器不会生成方法调用,因为该方法是有条件的,或者是没有实现的部分方法。

但是暂停 R# 并在 NUnit 中运行测试具有相同的结果,在 VS 中也没有错误或警告。所以我认为这只是因为 ReSharper 还没有突出代码合同的兼容性。

我查看了文档,据我所知,我不应该遇到这个问题。

我是在错误地使用代码合同,还是我的环境阻止了它以某种方式工作?

谢谢你。

0 投票
2 回答
924 浏览

c# - 接口类型的代码契约类的命名约定

我正在使用System.Diagnostics.Contracts命名空间中的代码契约类来为我的对象定义一些契约,我想知道当契约是针对基本接口定义时,其他人如何命名他们的契约类。让我用一个小例子来说明:

在本例中,我将合同类命名为 AnimalContract,但还有更好的名称吗?因为契约是针对一个接口定义的,所以我几乎想将类命名为 IAnimalContract 来说明它是 IAnimal 接口的契约。这样,当我在解决方案资源管理器中看到这两个项目时,它们在视觉上是“结合在一起的”,这有助于让我的头脑保持整洁。当然,合约本身并不是一个接口,所以以这种方式命名它对我来说很糟糕。

在这些情况下,你们(和女孩)如何命名您的合同类?有普遍接受的约定吗?

0 投票
1 回答
568 浏览

visual-studio-2008 - 代码合同减慢了 Visual Studio 2008

自从我开始在 Visual Studio 2008 (C#) 中使用代码协定后,构建我的 dll 变得非常缓慢。我没有打开静态检查,但显然重写需要永远......

有没有办法解决这个问题,这会在未来版本的 Microsoft 代码合同中得到改进吗?

更新:在 VS2008 中构建时,即使在程序集的属性中关闭静态分析,它也会对每个 dll 运行静态分析...

0 投票
1 回答
235 浏览

code-contracts - 必须证明所有派生类中的基类属性不变?

我有一个基类,我在其中尝试使用 Null Object 模式来提供默认记录器实现,然后可以在稍后阶段通过 IoC setter 注入进行更改。

正如我在代码中指出的那样,我的问题是我在派生类的构造函数末尾收到一条警告,指出基类中的“Logger!= null”对象不变性尚未得到证明,即使很明显没有任何变化Logger 属性值,我也有围绕 setter 的合同,以确保它永远不会为空。

有什么办法可以避免在所有派生类中重新证明这一事实,或者这只是静态分析器的限制?

更新:问题已在最新版本的 CodeContracts 中得到修复。此外,我不再需要抽象基类构造函数中的断言(“Contract.Assert(Logger != null);”行)

0 投票
4 回答
615 浏览

c# - CodeContracts - 误报

我刚刚开始在一个现有的中型项目上使用 .NET 4 中的 CodeContracts 进行试验,令我惊讶的是静态检查器给了我关于以下代码的编译时警告:

为什么 CodeContracts 静态检查器抱怨 strs.Add(...) 行?strs 不可能为空,对吧?难道我做错了什么?

0 投票
2 回答
1761 浏览

visual-studio-2010 - system.diagnostics.contracts.contract 在 v4.0 v3.5 中都存在

我刚刚升级到 Visual Studio 2010 并安装了代码合同 msi。当我尝试使用它时,我得到一个编译器错误,即 system.diagnostics.contracts.contract dll 存在于 v3.5 和 v4 框架中。有谁知道我应该怎么做才能解决这个问题?谢谢。

0 投票
2 回答
322 浏览

c# - C# 代码契约:为什么不能证明这个简单的条件?

我正在对代码合同进行简单的测试。下面的代码是一个winform。这通过(当然):

但是,我只添加了一个非常简单的间接级别,它说“需要未经证实”:

这似乎是微不足道的证明。为什么它不起作用?

0 投票
1 回答
531 浏览

c# - 这是代码合同重写器中的错误吗?

我正在试验 .NET 代码合同。以下代码在运行时契约检查关闭时运行良好,但在运行时契约检查打开失败:

运行此代码时出现的错误不是违反合同。相反,重写器似乎正在以某种方式生成损坏的二进制文件:

未处理的异常:System.BadImageFormatException:尝试加载格式不正确的程序。(来自 HRESULT 的异常:0x8007000B)在 ConsoleApplication1.Program.Main(String[] args)

如果我删除以下行,错误就会消失:

我做错了什么,或者这是二进制重写器中的错误?我能做些什么呢?

0 投票
2 回答
1946 浏览

msbuild - 在使用 MSBuild 构建的库代码中使用代码协定

我已经开始在我正在编写的所有新代码中使用代码契约,例如在我正在构建的框架库中,以帮助在 ASP.NET MVC 应用程序中引导IoCO/RM等。我为这个框架库编写了一个简单的构建脚本,如下所示:

这行不通。如果我运行它,我最终在我的build文件夹中得到的是,无论出于何种原因,没有完全重写的程序集,以及ccrewrite在输出目录中乱扔垃圾的文件。.pdb.original.rewritten.csproj.FileListAbsolute.txt

起作用的是首先在 Visual Studio 2010 中构建解决方案,在批处理文件中注释掉第 3 行到第 7 行并再次运行它。然后我得到了正确重写的程序集,没有.pdb.original文件.rewritten

我从中推断的是,Visual Studio 2010 以某种方式正确地触发了代码合同重写器,因此来自 Visual Studio 2010 构建的结果程序集被命令行 MSBuild 调用重新使用,所以我的批处理脚本基本上只是将文件复制到build目录。换句话说,相当没用。

我读过这个,但乔恩的问题似乎与我的不同,因为ccrewrite显然是在做某事,但无论出于何种原因,它都没有完成重写。该Integration.build文件构建了正确的配置(在.csproj文件中启用了代码合同),其他一切看起来都正确,只是无法正常工作。

所以,我想知道:如何以 Visual Studio 2010 的方式运行 MSBuild,ccrewrite并且不会在输出目录中乱扔.rewritten文件.pdb.original?有没有人有一个完美的例子来说明 MSBuild 文件如何进行正确的代码合同重写?