标签: code-contracts

我错误地实施了这个简单的合同吗?

这是我的代码:

public class RegularPolygon
{
    public int VertexCount;
    public double SideLength;

    public RegularPolygon(int vertexCount, double sideLength)
    {
        Contract.Requires(vertexCount >= 3);
        VertexCount = vertexCount;
        SideLength = sideLength;
    }

    [ContractInvariantMethod]
    private void RegularPolygonInvariants()
    {
        Contract.Invariant(VertexCount>=3);
    }

}
Run Code Online (Sandbox Code Playgroud)

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

[TestFixture]
class TestRegularPolygon
{
    private RegularPolygon _polygon;

    [SetUp]
    public void Init()
    {
        _polygon = new RegularPolygon(1, 50);
    }

    [Test]
    public void Constructor()
    {
        Assert.That(_polygon.VertexCount,Is.GreaterThanOrEqualTo(3));
    }

}
Run Code Online (Sandbox Code Playgroud)

以上测试也通过,我无法弄清楚为什么!

起初我以为ReSharper可能会弄乱一些东西,因为它会在我尝试使用Contract命名空间中的方法时显示该行并显示此消息:

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

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

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

我是否正确使用代码合同或是我的环境阻止它以某种方式工作?

谢谢.

c# resharper design-by-contract visual-studio-2010 code-contracts

17
推荐指数
1
解决办法
5343
查看次数

代码契约和异步

将后置条件添加到返回的异步方法的推荐方法是什么Task<T>

我已经阅读了以下建议:

http://social.msdn.microsoft.com/Forums/hu-HU/async/thread/52fc521c-473e-4bb2-a666-6c97a4dd3a39

帖子建议将每个方法实现为同步,签约,然后将异步对应实现为简单的包装器.不幸的是,我不认为这是一个可行的解决方案(也许是通过我自己的误解):

  1. 异步方法虽然被假定为同步方法的包装器,但没有任何真正的代码契约,因此可以按照自己的意愿进行.
  2. 致力于异步的代码库不太可能为所有内容实现同步对应.因此,实现包含await其他异步方法的新方法因此被强制为异步.这些方法本质上是异步的,不能轻易转换为同步.它们不仅仅是包装纸.

即使我们通过说我们可以使用.Result.Wait()代替await(这实际上会导致某些SyncContexts死锁,并且无论如何都必须在异步方法中重写)来使后一点无效,我仍然相信第一点.

有没有其他想法,或者有什么我错过的代码合同和TPL?

.net c# code-contracts task-parallel-library async-ctp

17
推荐指数
1
解决办法
1252
查看次数

.NET Guard类库?

我正在寻找提供保护方法的库或源代码,例如检查空参数.显然这个构建起来相当简单,但我想知道.NET是否还有.谷歌的基本搜索没有透露太多信息.

.net code-contracts

16
推荐指数
2
解决办法
1万
查看次数

将代码合同部署到生产环境中是不是很糟糕?

我正在引用这个答案(强调我的):

看看ContractClass和ContractClassFor属性.这允许您在单独的程序集中编写具有代码契约的类.这使您可以使合同可用于开发工作,不会使代码混乱,也意味着您不必使用实时代码部署合同

  1. 你为什么不想要部署合同?

  2. 从最佳实践角度来看,合同是否严格用于开发和质量控制?

.net code-contracts

16
推荐指数
1
解决办法
1418
查看次数

具有非null保护子句的自动实现的属性?

我同意马克·西曼的观点,即自动属性在某种程度上是邪恶的,因为它们打破了封装.但是,我确实喜欢它们带来的简洁语法,可读性和便利性.

我引用:

public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)

代码片段的问题并不在于它包含太多的仪式.问题是它破坏了封装.事实上

"[...] getter和setter没有实现封装或信息隐藏:它们是一种语言合法化的方式来违反它们."

James O. Coplien和GertrudBjørnvig.精益建筑.威利.2010. p.134.

大多数情况下,添加一个非null保护子句对于属性设置器来说已经足够了,我想知道是否有比下面的更好的方法.更好的是,我的意思是更简洁/更少重复.

使用代码合同:

private string _username;
public virtual string Username
{
    get { return _username; }
    set 
    {  
        Contract.Requires(value != null);
        _username = value; 
    }
}
Run Code Online (Sandbox Code Playgroud)

使用vanilla .NET:

private string _username;
public virtual string Username
{
    get { return _username; }
    set 
    {
        if (value == null) throw new ArgumentNullException("Username");
        _username = value; 
    }
}
Run Code Online (Sandbox Code Playgroud)

c# automatic-properties code-contracts guard-clause

16
推荐指数
1
解决办法
4187
查看次数

那么C#4.0代码合同实际上做了什么吗?

在阅读System.Diagnostics.Contracts.Contract了受Spec#令人敬畏的影响的静态类之后,我很激动,并立即开始通过调用Contract.Requires()和编写代码Contract.Ensures().

我想这只是因为我的代码是如此超级棒和无错误,检查那些调用实际做了什么直到最近才出现.一个错误滑过,我意识到这些电话没有做任何事情!我原以为他们至少会在违反条件时抛出异常,但没有这样的运气.

我错过了什么吗?有谁知道这是什么意思?

.net c# code-contracts c#-4.0

15
推荐指数
1
解决办法
1848
查看次数

我应该使用哪种,CodeContract还是CuttingEdge.Conditions?

我研究了使用条件框架来验证数据而不是

if(cond) throw new SomeException();

SomeFramework.MakeSure(cond);
Run Code Online (Sandbox Code Playgroud)

最后,我的选择是使用CodeContractCuttingEdge.Conditions框架.

我无法决定使用哪个框架.我可以告诉你,我不喜欢'CodeContract'框架,你必须安装额外msi的才能使用它以及你需要选择的选项; 不是那么糟糕,但感觉不自然.(当然它还在MS研究中.)

你怎么看?

c# code-contracts

15
推荐指数
3
解决办法
1971
查看次数

建立代码合同?

我有以下方法:

private void DoSomething(CoolClass coolClass)
{
    if (coolClass == null)
    {
        throw new ArgumentNullException("coolClass");
    }
    coolClass.Name = "Pepe";
}
Run Code Online (Sandbox Code Playgroud)

使用代码契约,我们可以这样写:

private void DoSomething(CoolClass coolClass)
{
    Contract.Requires<ArgumentNullException>(coolClass != null, "IS NULLL!");
    coolClass.Name = "Pepe";
}
Run Code Online (Sandbox Code Playgroud)

第二种方法更短更简单.我遇到的问题是,当你构建它时,在运行时它不会抛出异常,它显示了这个:

说明:必须使用代码契约二进制重写器(CCRewrite)重写程序集(可能是"CodeContractsTest"),因为它正在调用Contract.Requires并且定义了CONTRACTS_FULL符号.从项目中删除CONTRACTS_FULL符号的任何显式定义并重建.CCRewrite可以从http://go.microsoft.com/fwlink/?LinkID=169180下载.安装重写器后,可以从"代码约定"窗格上项目的"属性"页面在Visual Studio中启用它.确保启用"执行运行时合同检查",这将定义CONTRACTS_FULL.

除非使用VS,否则请从此处下载.net的CodeContracts .

然后检查项目中的"运行时检查",以便在运行时构建它时,抛出异常.

我们的应用程序是使用Jenkins和PowerShell脚本构建的.有没有办法检查运行时并抛出异常,使用简单的命令或属性,或者简单的东西?

c# code-contracts

15
推荐指数
2
解决办法
1万
查看次数

如何(完全)卸载Code Contracts Tool扩展?

我正试图摆脱我的系统上的Code Contracts Tools扩展.我已经从"程序和功能"中卸载它,但它仍然显示为Visual Studio中的已安装扩展.

任何帮助,将不胜感激.

.net code-contracts visual-studio

15
推荐指数
1
解决办法
2382
查看次数

确保IEnumerable不为空的合同

给定的代码

static public int Q()
{
    return Enumerable.Range(0, 100)
        .Select(i => i)
        .First();
}
Run Code Online (Sandbox Code Playgroud)

发出以下警告:

warning : CodeContracts: requires unproven: Any(source)
Run Code Online (Sandbox Code Playgroud)

如果我删除.Select()它,它就会消失.

但目前还不清楚我究竟是什么,我需要.Ensure这样的cccheck很满意.

.net c# static-analysis code-contracts

15
推荐指数
1
解决办法
202
查看次数