Tag: 代码合同

C#代码合同userMessage参数

我在C#中使用代码契约,但我有点好奇我应该为userMessage参数输入什么。 我举一个简短的例子。 我的代码中有以下断言: Contract.Assert(IsValidReferenceData(refData)); 此消息永远不会显示给用户,但对于我自己和该软件的其他开发人员/维护人员来说,在例外中有一个英文消息描述会很好。 最初我想 Contract.Assert(IsValidReferenceData(refData), “Payment Reference is not valid”); 但后来我认为userMessage完全与布尔条件相反,所以我把它重写为: Contract.Assert(IsValidReferenceData(refData), “Payment Reference is valid”); 因此消息和条件是相同的。 然而,这会让人们在看到exception报告时感到困惑,然后想一想,“如果引用有效,那么为什么会抛出exception?”。 最后,我想,为什么不做一个中立的陈述,这说明必须是真的: Contract.Assert(IsValidReferenceData(refData), “Payment Reference must be valid”); 以上哪项是最佳做法? 我想得到正确的消息,因为我计划在整个地方使用断言,以防止数据的不规则,为此我启用运行时检查。

代码合同确保ReSharper ExternalAnnotations

有谁知道如何在ReSharper ExternalAnnotations中添加代码合同保证? 它不在最后的v7.1.3中,也不在最新的v8 EAP中,也不存在于任何浮动的自定义xmls中。 具体来说,它应检测方法是否不返回null: Contract.Ensures(Contract.Result() != null);

Moq和代码合同

使用类不变量时,Code契约似乎在任何地方都会引入代码。 像这样的东西 [ContractClassFor(typeof(IX))] interface IXContract { [ClassInvariant] void Invariant() { … } } [ContractClass(typeof(IXContract))] interface IX { event EventHandler b; } var a = new Mock(); a.Raise(x => xb += null); 失败并显示错误消息 Could not locate event for attach or detach method Void $InvariantMethod$(). 有人知道解决方案吗?

CodeContracts:可能在空引用上调用方法

我正在使用CodeContracts静态分析工具 。 我的代码: 截图http://sofzh.miximages.com/c%23/r91zq9.png ( ASCII版 ) 该工具告诉我instance.bar可能是一个空引用。 我相信相反。 谁是对的? 我怎么能certificate它错了?

结合代码契约和正则表达式

所以我有一个非常简单的类,其中一个字符串作为属性。 该字符串必须具有某种模式。 我正在尝试使用代码合同来强制执行此操作。 该类看起来像这样: class SimpleClass { public Property { get; set; } public SimpleClass(string prop) { Contract.Requires(IsValid(prop)); this.Property = prop; } [ContractInvariantMethod] void ObjectInvariant() { Contract.Invariant(IsValid(Property)); } bool IsValid(string arg) { // Use regex to check if arg is a valid string } } 非常直截了当。 但是,这会引发一个不可读的exception,另一个说“Member SimpleClass.IsValid的可见性低于封闭方法SimpleClass。#ctor(System.String)”。 为什么这是非法的? 我应该将正则表达式复制/粘贴到两种方法中吗? 这似乎与正确相反。 请帮我理解!

为遗留库创建代码合同

最终目标是指定一个类的合同,该类驻留在我无法控制的外部程序集中(即我不能直接向该类添加合同)。 到目前为止我尝试了什么: ContractClassFor属性。 不起作用,因为目标类必须指向合同类。 通过对自动生成的程序集进行逆向工程来手动构建合同引用程序集(即MyAsm.Contracts.dll)。 不起作用,因为在我编译之后,重写器启动并方便地剥离ContractDeclarativeAssembly属性,这使得程序组件无法识别为“合同引用程序集”。 而且我找不到关闭转码器的方法。 创建一个具有相同名称,版本,强名称(如果有)和其他属性作为目标程序集的“假”程序集,并在其中放置具有相同命名方法的同名类。 然后在打开“构建合同引用”选项的情况下编译该程序集,然后获取生成的合同引用程序集并使用它。 由于某种原因,这也没有用,虽然我不知道究竟是什么原因。 静态检查器只是忽略了我的smartypants生成的引用程序集,就好像它不存在一样。 还有一件事,以防万一重要:目标程序集是为.NET 2.0编译的,我不能为4.0重新编译它。 更新 编写一个定义合同的“包装”库是不可能的。 首先,它需要编写很多额外的代码。 但即使你把它放在一边,也可能是一个重大的性能损失:我必须(可能)为每个“遗留”类型创建包装类,从我的“遗留”方法中用作返回类型。 但即便如此,也不是故事的结局。 想象一下,某些方法可能会返回对基接口的引用,然后调用代码可能会将它们转换为派生接口,以查看该对象是否支持更多function。 我如何包装那些? 我可能必须在我的包装类上提供自定义Cast()方法,它们将尝试转换底层类/接口,并在成功时返回结果包装器。 最后,我的整个代码库将变得如此复杂,无论如何它可能都不值得。 另一方面,CC团队本身已经成功解决了这个问题:他们为mscorlib,System.Core和其他一些系统组件提供了合适的合同参考组件,不是吗? 他们是如何建立起来的? 如果他们能够做到这一点,那么我认为没有任何理由说明我不应该采取相同的技巧。 哦,实际上,我确实看到了一个原因:我不知道该怎么做。 🙂 – Fyodor Soikin 18秒前编辑

生成REST对象的合同

我是REST的新手,听起来应该很简单。 在.NET应用程序中,我可以创建对WCF服务的引用,并为我生成所有可用类型的合同。 现在我正在尝试在Windows Phone 7应用程序中使用REST服务。 虽然我可以进行调用并获得正确的响应,但是有一种简单的方法来创建每个对象将被反序列化的类吗? 我正在使用RestSharp来管理我的呼叫。 在我看到的一些例子中,用户已经创建了自己的类,并手动生成了xml。 如果可能的话,我想避免这种情况。 非常感谢!

可以从立即窗口调用扩展方法

我问这个问题,因为每当我尝试从Visual Studio 2010中的立即窗口调用扩展方法时,我都会收到以下错误: System.Collections.Generic.IEnumerable’不包含’ToList’的定义,也没有扩展方法’ToList’接受类型’System.Collections.Generic.IEnumerable’的第一个参数(你是否缺少using指令或assembly参考?) 如果立即窗口不支持扩展方法,那么为什么当我键入我的变量(类型为IEnumerable )后跟一个点时,IntelliSense会列出所有扩展方法? 我在命令窗口中输入的内容没有任何问题,因为如果我将其复制并粘贴到我的代码文件中并运行,则可以正常工作。 使用Visual Studio 2012为同一解决方案做同样的事情工作正常。 如果我切换回VS2010并且问题仍然存在。

如何使代码约定忽略特定的程序集引用?

我正在扩展Visual Studio。 在代码中我使用代码约定来进行断言和检查。 我将警告选项级别设置为高。 我想要做的是保持警告级别,同时忽略对EnvDTE引用进行的任何检查。 请考虑以下代码示例: public static string GetAbsoluteOutputFolder(EnvDTE.Project project) { if (project == null) throw new ArgumentNullException(“project”); var path = project.ConfigurationManager.ActiveConfiguration.Properties.Item(“OutputPath”).Value.ToString(); //… } 使用我当前的设置,CC将要求我在分配path变量之前添加以下检查: Contract.Assume(project.ConfigurationManager != null); Contract.Assume(project.ConfigurationManager.ActiveConfiguration != null); Contract.Assume(project.ConfigurationManager.ActiveConfiguration.Properties != null); 因此,我想在这里做的是告诉CC“信任”EnvDTE并忽略这些类型及其属性。 我认为“对外部API持乐观态度”CC选项就是为了这个目的而服务的。 事实certificate它没有。 有没有办法让它按照我想要的方式运行, 不需要较低的警告级别 ? 编辑:我想要一个在项目级别工作的解决方案,并且仍然允许执行“常规”检查。

代码合同似乎不适用于VS2012

我正在阅读代码契约,乍一看似乎是相当革命性的,但我似乎无法让它们发挥作用。 我正在运行Windows 8和Visual Studio 2012 Premium(两者的发行版本)。 然后,我通过单击“下载代码合同”链接从此处安装了代码合同。 然后我在一个全新的控制台应用程序中编写了以下代码: class Program { static void Main(string[] args) { var answer = Add(0, 5); Console.Write(answer); Console.ReadLine(); } static int Add(int x, int y) { Contract.Requires(x > 0 && y > 0); return x + y; } } 我希望编译失败,因为Add的第一个参数是0,但是程序成功并向控制台输出5。 我已尝试使用默认的代码合约设置,并且还使用了一些东西而无济于事。 我当前的设置如下所示: 我有什么想法我做错了吗? 更新: 这是Build窗口的结果。 看起来它正在做某事,但只是提出警告而不是错误。 在我观看的video中,这些内容被标记为编译错误,程序甚至无法运行。 1>—— Build started: […]