Tag: 代码合同

代码合同+代码分析

我想在我的代码库中开始使用代码约定 。 我已经使用了代码分析,启用了所有规则,并且目标是零警告。 但是,当使用Contract.Requires(parameter != null)我收到代码分析的警告,即CA1062: CA1062:Microsoft.Design:在外部可见方法’Foo’中,在使用之前validation参数’parameter’。 这很不幸,我不想禁用该规则,因为我发现它很有用。 但我也不想压制它的每一个错误发生。 有解决方案吗?

C#4.0中关于代码合同的书籍

尽管我已经知道Code Contracts已经有一段时间了,因为我在Java中使用过它,我想在C#中开始使用它们,因为它们是C#4.0的一部分。 我正在寻找学习材料,书籍或video。 也欢迎使用Altough教程,我想要全面阅读,而不是典型的“这里是你如何使用需求,这里是你如何使用Ensures”。 我正在寻找在这个领域非常突出的东西。 谢谢

CodeContracts:布尔条件求值为常数值,为什么?

我收到了这个警告,但无法弄清楚问题…… CodeContracts:警告:布尔条件d1.Count!= d2.Count始终求值为常量值。 如果它(或它的否定)出现在源代码中,您可能会有一些死代码或冗余检查 代码如下: public static bool DictionaryEquals(IDictionary d1, IDictionary d2) { if (d1 == d2) return true; if (d1 == null || d2 == null) return false; if (d1.Count != d2.Count) return false; // <– warning here // Equality check goes here return true; } // Equality check goes here部分可以按原样,或者由适当的实现替换,我仍然得到相同的警告。

代码合同:ccrewrite以代码-1退出?

我是代码合同的新手。 我下载了最新版本的代码合同项目(1.4.40314.1)并开始在我的项目中实现它。 当我通过VS2010中的代码合同选项卡启用“Runtume Checking”时,出现此错误 Error 1 The command “”C:\Program Files (x86)\Microsoft\Contracts\Bin\ccrewrite” “@Application1ccrewrite.rsp”” exited with code -1. 每次我建立项目。 Plz的帮助。 现在这对我来说是个主要问题。 使用代码契约的每个项目在VS2010错误窗口中显示相同的错误,在输出窗口中找不到’Application1ccrewrite.rsp’,但它就在那里。 我尝试了一切。 我安装了两个版本(Pro,Std),但问题仍然存在。 Plz帮忙!

Code Contracts 实现接口方法{Interface.Method}因此无法添加需求

我有以下情况: public interface ISomething { void DoStuff(); //… } public class Something : ISomething { private readonly ISomethingElse _somethingElse; //… public Something (ISomethingElse somethingElse) { Contract.Requires(somethingElse != null); _somethingElse = somethingElse; } public void DoStuff() { // *1* Please look at explanation / question below _somethingElse.DoThings(); } } 在第1行,打开静态检查器,我会收到一条警告,说_somethingElse可能为null,如果我添加一个合同,它会给我错误 [Type]实现接口方法{Interface.Method}因此无法添加需求 这里最好的事情是什么? 我看到的选项包括 一个保护条款,虽然看起来有点极端 Contract.Assume 一个我没想过的隐藏的第三个选项 […]

Contract.Ensures如何运作?

我开始使用代码合同,虽然Contract.Requires非常简单,但我很难看到Ensures实际上做了什么。 我试过创建一个像这样的简单方法: static void Main() { DoSomething(); } private static void DoSomething() { Contract.Ensures(false, “wrong”); Console.WriteLine(“Something”); } 我从来没有看到消息“错误”,也没有抛出exception或其他任何东西。 那它实际上做了什么?

建立代码合同?

我有以下方法: private void DoSomething(CoolClass coolClass) { if (coolClass == null) { throw new ArgumentNullException(“coolClass”); } coolClass.Name = “Pepe”; } 使用代码契约,我们可以这样写: private void DoSomething(CoolClass coolClass) { Contract.Requires(coolClass != null, “IS NULLL!”); coolClass.Name = “Pepe”; } 第二种方法更短更简单。 我遇到的问题是,当你构建它时,在运行时它不会抛出exception,它显示了这个: 说明:必须使用代码契约二进制重写器(CCRewrite)重写程序集(可能是“CodeContractsTest”),因为它正在调用Contract.Requires并且定义了CONTRACTS_FULL符号。 从项目中删除CONTRACTS_FULL符号的任何显式定义并重建。 CCRewrite可以从http://go.microsoft.com/fwlink/?LinkID=169180下载。 安装重写器后,可以从“代码约定”窗格上项目的“属性”页面在Visual Studio中启用它。 确保启用“执行运行时合同检查”,这将定义CONTRACTS_FULL。 除非使用VS,否则请从此处下载.net的CodeContracts。 然后检查项目中的“运行时检查”,以便在运行时构建它时,抛出exception。 我们的应用程序是使用Jenkins和PowerShell脚本构建的。 有没有办法检查运行时并抛出exception,使用简单的命令或属性,或简单的东西?

代码契约:我们是否必须在委托方法中冗余地指定Contract.Requires(…)语句?

我打算使用新的.NET 4 Code Contractsfunction进行未来的开发。 这让我想知道是否必须在一系列方法中冗余地指定等效的Contract.Requires(…)语句。 我认为一个代码示例胜过千言万语: public bool CrushGodzilla(string weapon, int velocity) { Contract.Requires(weapon != null); // long code return false; } public bool CrushGodzilla(string weapon) { Contract.Requires(weapon != null); // specify contract requirement here // as well??? return this.CrushGodzilla(weapon, int.MaxValue); } 对于运行时检查它并不重要,因为我们最终总是会遇到需求检查,如果失败我们会收到错误。 但是,当我们再次在第二次超载中没有指定合同要求时,这被认为是不好的做法吗? 此外,还将具有编译时检查的function ,并且还可能设计代码合同的时间检查 。 在Visual Studio 2010中,它似乎尚不适用于C#,但我认为有一些类似Spec#的语言已经可以使用。 当我们编写代码来调用这样的方法并且我们的参数当前可以或将为null时,这些引擎可能会给我们提示。 所以我想知道这些引擎是否总是会分析一个调用堆栈,直到找到一个目前不满意的合同方法? 此外, 在这里我了解了Contract.Requires(…)和Contract.Assume(…)之间的区别 。 […]

由合同和构造者设计

我正在为学校目的实现我自己的ArrayList,但为了调整一些东西,我正在尝试使用C#4.0代码契约。 一切都很好,直到我需要将Contracts添加到构造函数中。 我应该在空参数构造函数中添加Contract.Ensures()吗? public ArrayList(int capacity) { Contract.Requires(capacity > 0); Contract.Ensures(Size == capacity); _array = new T[capacity]; } public ArrayList() : this(32) { Contract.Ensures(Size == 32); } 我会说是的,每种方法都应该有明确的合同。 另一方面,如果只是将工作委托给“主”构造函数,为什么要这样做呢? 逻辑上,我不需要。 我认为在两个构造函数中明确定义合同有用的唯一方面是,如果将来我们对合同有Intelisense支持。 如果发生这种情况,那么明确每种方法所具有的合同是非常有用的,因为它出现在Intelisense中。 此外,是否有任何书籍更深入地了解合同设计的原则和用法? 有一件事是知道如何在一种语言中使用Contracts的语法(在本例中为C#),另一种是知道如何以及何时使用它。 我阅读了几篇教程和Jon Skeet关于它的C#深度文章,但如果可能的话,我想更深入一些。 谢谢

在代码合同中使用Contract.ForAll

好的,我还有另一个Code Contracts问题。 我有一个接口方法的合同,看起来像这样(为清楚起见省略了其他方法): [ContractClassFor(typeof(IUnboundTagGroup))] public abstract class ContractForIUnboundTagGroup : IUnboundTagGroup { public IUnboundTagGroup[] GetAllGroups() { Contract.Ensures(Contract.Result() != null); Contract.Ensures(Contract.ForAll(Contract.Result(), g => g != null)); return null; } } 我有代码消耗这样的接口: public void AddRequested(IUnboundTagGroup group) { foreach (IUnboundTagGroup subGroup in group.GetAllGroups()) { AddRequested(subGroup); } //Other stuff omitted } AddRequested需要一个非null的输入参数(它实现了一个具有Requires契约的接口),因此我在传入AddRequested组中得到一个’requires unproven:group!= null’错误。 我正确使用ForAll语法吗? 如果是这样并且求解器根本不理解,是否有另一种方法可以帮助求解器识别合同,或者我只需要在调用GetAllGroups()时使用Assume?