Tag: 代码合同

代码合同在.NET 4.0中的实际用法是什么?

为了充分理解和利用新的.NET Framework 4.0的新function和增强function,我希望得到一个真实应用代码合同的例子。 任何人都有这个function的应用很好的例子? 我想得到一个简单的解释代码示例,以帮助我起床并运行它。

捕获的.NETexception是意外的空

请参阅下面的说明正在发生的事情 我有一个非常奇怪的问题,捕获的exception是null。 代码使用MEF并尽力报告组合错误。 使用debugging器,我可以看到抛出的exception( InvalidOperationException ),但是当它被下面的代码中的最后一个catch块捕获时, exvariables为null。 在debugging器和正常执行代码时都是如此。 static T ResolveWithErrorHandling<T>() where T : class { try { IocContainer.Compose(Settings.Default.IocConfiguration); return IocContainer.Resolve<T>(); } catch (ReflectionTypeLoadException ex) { // … special error reporting for ReflectionTypeLoadException } catch (Exception ex) { // ex is null – that should not be possible! // … general error reporting for other […]

Microsoft代码合同和CI构build服务器

我们正在迁移到.NET 4,并对实施新的Design By Contractfunction非常感兴趣。 正如我们所知, Code Contract引擎需要安装Code Contract插件 和VS Ultimate或Premium(用于静态检查)。 这是我的问题: 我可以使用代码合同重写而不在CI构build服务器(TeamCity)上安装VS? 有没有任何msbuild任务来执行合同检查? 您是否使用代码合同对CI构build进行validation?

假阳性:先决条件是多余的

为什么一旦警告级别处于第二级或更高级别,这个小代码示例就会得到以下警告? public int Foo(int a) { if (a >= 0) throw new ArgumentException("a should be negative", "a"); Contract.EndContractBlock(); return a; } CodeContracts:build议的要求:这个先决条件是多余的:考虑删除它。 你比较一个结构值为null? 显然,整数可以是负数,所以前提条件很难多余,那么为什么我会得到这个警告呢? 编辑:这是什么ILSpy显示创build的function在看exe时: public int Foo(int a) { if (a >= 0) { ContractHelper.RaiseContractFailedEvent(ContractFailureKind.Precondition, null, "a < 0", null); throw new ArgumentException("a should be negative", "a"); } return a; }

.NET 4.0代码合同 – 它们将如何影响unit testing?

比如这篇文章介绍了他们。 有什么好处? 静态分析看起来很酷,但同时也会阻止在unit testing中将null作为parameter passing的能力。 (如果你是在文章中的例子) 关于unit testing这个话题,如果你现在已经开始进行自动化testing了,现在肯定是没有意义的。 更新 玩过代码合同,我有点失望。 例如,根据接受的答案中的代码: public double CalculateTotal(Order order) { Contract.Requires(order != null); Contract.Ensures(Contract.Result<double>() >= 0); return 2.0; } 对于unit testing,您仍然需要编写testing以确保不能传递null,如果合同是业务逻辑 ,则结果大于或等于零。 换句话说,如果我要删除第一份合同,除非我专门对这个function进行了testing,否则testing不会中断。 这是基于不使用内置于Visual Studio的更好(最终等)版本的静态分析。 基本上,他们都归结为写传统的if语句的替代方式。 我实际使用TDD的经验,代码合同显示了为什么,以及我如何去做。

微软代码合同框架有多成熟?

微软最近在DevLabs上发布了一个商业授权的代码合同框架。 我们有兴趣在我们的项目(主要是C#,一些C ++ / CLI)中使用它们来逐步replace所有的自定义validation代码,但是我很想知道其他人在使用它之前的经验,特别: 你认为这个框架对于大型复杂的商业项目是否足够成熟? 你在使用时遇到了什么问题? 你从中得到什么好处? 目前比现在更痛苦吗? 我意识到,这是一个有点主观的问题,因为它需要意见,但是鉴于这个框架是.NET 4.0的一个非常重要的部分,并且将(可能)改变我们所有编写validation代码的方式,所以我希望这个问题将会被留下打开收集这方面的经验,以帮助我作出一个具体的,可回答的问题的决定: 我们是否应该在下个月开始使用它? 请注意,我们不提供代码API,只有一个Web服务,所以对于大多数代码打破兼容性而言,抛出的exceptiontypes并不是一个问题。 然而,正如我希望更多的人,而不仅仅是我会受益于这个职位和答案,围绕这个领域的任何细节都是值得欢迎的。

你为什么不能赶上代码合同例外?

System.Diagnostics.Contracts.ContractException不能在我的testing项目中访问。 注意这个代码纯粹是自己搞乱了Visual Studio的新版本,但是我想知道我做错了什么。 我使用VS的专业版,所以我没有静态检查。 为了仍然使用代码合约(我喜欢),我认为我的方法可以工作的唯一方法是捕获在运行时抛出的exception,但我不觉得这是可能的。 testing方法 [TestMethod, ExpectedException(typeof(System.Diagnostics.Contracts.ContractException))] public void returning_a_value_less_than_one_throws_exception() { var person = new Person(); person.Number(); } 方法 public int Number() { Contract.Ensures(Contract.Result<int>() >= 0); return -1; } 错误 错误1“System.Diagnostics.Contracts.ContractException”无法访问 由于其保护水平。 编辑 经过一些更多的思考,我已经得出结论中讨论的结论,以及以下内容。 给定一个方法,如果这个要求可以用代码合同的forms来表示,我会这样写testing。 [TestMethod] [ExpectedException(typeof(ArgumentException))] public void value_input_must_be_greater_than_zero() { // Arrange var person = new Person(); // Act person.Number(-1); } 这将确保合同是代码的一部分,并不会被删除。 这将要求代码合同实际上抛出指定的例外。 […]

真的想在C#中使用CodeContracts

我终于开始追赶已经join到.NET 3.5 / 4.0框架中的所有新function。 最近几天我一直在与CodeContracts合作,我真的很想去喜欢它们。 我很好奇别人怎么看待C#中CodeContracts的实现? 具体来说,人们如何组织合同类的接口,合同不变约等方法? 我喜欢合同提供的validation,乍一看,他们看起来不错。 通过几行简单的代码,我甚至可以运行我的代码之前就可以获得一些很好的构build检查。 不幸的是,我很难理解代码合同在C#中的实现方式,他们比编写合同更加混乱了我的代码。 为了充分利用契约,我用假设和断言等方式乱抛我的代码(我知道有些人会说这是件好事)。 但是正如下面的一些例子所显示的那样,它将一条简单的线条变成了四条或五条线,并且在我看来,它并没有为替代方法(即断言,exception等)增加足够的价值。 目前,我最大的挫折是: 界面合同: [ContractClass(typeof(IInterfaceContract))] public interface IInterface { Object Method(Object arg); } [ContractClassFor(typeof(IInterface))] internal abstract class IInterfaceContract { private IInterfaceContract() { } Object IInterface.Method(Object arg) { Contract.Requires(arg != null); Contract.Ensures(Contract.Result<Object>() != null); return default(Object); } } 这对我来说就像是一个混乱,我希望有一个更清晰的方式来logging要求,无论是通过属性或某种forms的内置语言支持。 事实上,我必须实现一个实现我的接口的抽象类,以便我可以指定合约似乎充其量是乏味的。 代码Bloat: typeof(Action<>).MakeGenericType(typeof(Object); 需要几个假设来validation可用的信息。 我知道所有的分析器都知道它是在Type上运行的,因此必须在这个有限的知识上工作,但是仍然让我感到沮丧的是,一行代码要求我重写为 var genericAction […]