标签: code-contracts

为什么这个C#代码合同格式错误?

我在下面编写此合同时显示错误.

错误20方法'.... get_Page'中的格式错误的合同部分

'if'块有问题吗?

public int? Page
{
get
{
    int? result = Contract.Result<int?>();

    if (result != null)
        Contract.Ensures(result >= 0);

    return default(int?);
}
}
Run Code Online (Sandbox Code Playgroud)

编辑:

Lasse V. Karisen发表评论时发表了评论:

怎么样:Contract.Ensures(result == null || result> = 0); ?

是卡里森,我之前尝试过这个并编译.但问题仍然存在:在使用合同时是不是可能有ifs?

我遇到的另一个问题是无能为力(主要考虑上面的例子),还涉及结果的使用:

public int IndexOf(T item)
{
    Contract.Assert(item != null);
    Contract.Assert((item as IEntity).ID > 0);

    int result = Contract.Result<int>();
    Contract.Ensures(result >= -1);

    return default(int);
}
Run Code Online (Sandbox Code Playgroud)

c# code-contracts microsoft-contracts c#-4.0

4
推荐指数
1
解决办法
3175
查看次数

有没有理由不使用代码合同的运行时合同检查?

我最近在.Net Rocks show 570(http://devjourney.com/community/dotnet-rocks-show-570-with-kevin-hazzard/)上听了Kevin Hazzard关于代码合同的讨论.他提到启用运行时合同检查作为一些人可能选择使用的选项,而其他人可能不会.

为什么不对代码合同使用运行时合同检查?是否会对绩效产生重大负面影响?其他原因?

如果禁用此功能,如何在运行时处理方法中的前提条件?

.net code-contracts

4
推荐指数
1
解决办法
523
查看次数

埃菲尔:放松前提条件并收紧后期条件?

在埃菲尔说,我们应该"放松前提条件并收紧后期条件",但我不确定这意味着什么.这种好处/如何受益于子类别?

谢谢

oop eiffel code-contracts

4
推荐指数
1
解决办法
298
查看次数

CodeContracts问题

您好CodeContracts有一点问题.我有一个类库项目,它作为一个带有方法foo的类(字符串s1,字符串s2); 在foo方法中,我有一个Contract.Requires(s1!= null).因此,如果我理解我的代码的含义(是的,我刚刚安装了CodeContracts并使用:),合同将在构建过程和运行时检查s1!= null表达式,抛出ArgumentException>.我想测试行为,当我从类lib项目调用foo(null,"test")时,设计师告诉我这个问题,但是当我从winform app项目调用它时,我没有得到任何警告错误列表窗口.那么这是否意味着代码合同只适用于它们所在的项目而不是外部?谢谢

UPDATE


我忘了提到我添加的前提条件在静态分析中不起作用.但是,它们会在运行时使用适当的消息抛出ArgumentException.

c# visual-studio-2010 code-contracts visual-studio

4
推荐指数
1
解决办法
700
查看次数

.NET 4.0中的开箱即用代码契约

我真的想在Visual Studio 2010中尝试新的代码契约,但我不想为Visual Studio安装额外的扩展(因为我的代码与我的同事共享).现在,当面向.NET 4.0时,我可以使用新的System.Diagnostics.Contracts命名空间,但我还没有让它做任何事情.

例如,使用

static void Main(string[] args)
{
    Greet(null);
    Console.ReadLine();
}

private static void Greet(string name)
{
    Contract.Requires(name != null);
    Console.Out.WriteLine("Hello {0}", name);
}
Run Code Online (Sandbox Code Playgroud)

程序编译并运行(显示"Hello"),没有任何警告.如果我尝试使用Contract.Requires<ArgumentNullException>(name != null),我会收到一条消息,告诉我必须使用重写器,无论名称的值如何.谷歌告诉我,当我安装Code Contracts premium时,我可以获得任何魔力,但是当我不安装时,这个命名空间的目的是什么?我可以将代码合同用于除开箱即用的精心评论之外的其他内容吗?

c# visual-studio-2010 code-contracts

4
推荐指数
1
解决办法
2191
查看次数

代码合同减慢了Visual Studio 2008的速度

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

有没有办法解决这个问题,这将在未来版本的Microsoft Code Contracts中得到改进吗?

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

code-contracts visual-studio-2008

3
推荐指数
1
解决办法
564
查看次数

为什么"代码合同"选项卡不出现在VS 2010中?

前几天我看到了Code Contracts的演示,并决定在一个小测试项目中试一试.

在向类中添加"using System.Diagnostics.Contracts"语句后,我可以适当地设置我的代码合约代码,但似乎没有强制执行合同.

我没有看到项目属性屏幕上出现"代码合同"选项卡的原因吗?

design-by-contract code-contracts

3
推荐指数
1
解决办法
883
查看次数

C# - 代码契约 - 检测表达式语句,评估潜在的副作用

我刚开始在C#中使用CodeContracts,我可能需要一些帮助.我有一个带有静态键列表的类,我有一个名为Remove()的静态方法,它从该列表中删除一个键.

现在我从合同发布条件中理解的是,作为类的程序员,我保证当前的公共方法做了特定的事情,在这种情况下:删除列表的元素.

这是我写的:

    private static List<Keys> m_usedKeys; // private list of keys

    public static void Remove(Keys _key)
    {
        m_usedKeys.Remove(_key);
        Contract.Ensures(!m_usedKeys.Any(x => x == _key));
    }
Run Code Online (Sandbox Code Playgroud)

我在这里尝试"确保"的是,Remove()方法从列表中删除了真实的密钥(是的,这可能是一个简单的例子,但我在那里得到了错误.)

当我写Contract.Ensures()行时,VS2010给出了以下错误:

Error   3   Detected expression statement evaluated for potential side-effect in contracts of method 'LibJungleTimer.KeyBind.Remove(System.Windows.Forms.Keys)'. (Did you mean to put the expression into a Requires, Ensures, or Invariant call?)  C:\Users\Joel\Documents\Programmation\JT\JungleTimer\LibJungleTimer\KeyBind.cs  51
Run Code Online (Sandbox Code Playgroud)

我认为这个错误表明该表达m_usedKeys.remove(_key);具有潜在的副作用.事实上,它有一个副作用,它从列表中删除一个键!

如果我尝试写这样的东西:

Contract.Assert(!m_usedKeys.Any(x => x == _key));
Run Code Online (Sandbox Code Playgroud)

好吧编译好.我的问题是我做错了什么?不应该使用CodeContracts来确保发布条件吗?

编辑:是的,我的意思是真的!m_usedKeys.Any(...);

.net c# vb.net code-contracts

3
推荐指数
1
解决办法
558
查看次数

如何指定确定输出参数?

我有一个带out参数的方法,我想Contract.Ensures()在方法返回时指定使用它,参数不会null.

基本上,这个:

void M(out object o)
{
    Contract.Ensures(o != null);

    o = new object();
}
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为看起来参数将在分配之前被读取:

错误CS0269:使用未分配的输出参数'o'

我以为我可以通过切换线来解决这个问题,但这也不起作用:

警告CC1005:CodeContracts:格式错误的合同.在方法'M(System.Object @)'中分配后找到保证.

有办法做到这一点吗?

我不想将方法切换到ref.我无法返回值而不是使用out,因为我遇到的实际方法已经有一个返回值:bool TryGetValue(TKey1 key1, TKey2 key2, out TValue value).

c# code-contracts

3
推荐指数
1
解决办法
203
查看次数

如何在C#中处理代码契约中的异常

我已经开始使用Code Contracts for .NET了.

  1. 我已经安装了msi.
  2. 在我的示例控制台应用程序中,在项目属性中,我将"Assembly Molde"设置为"标准合同要求".
  3. 我已将"执行运行时合同检查"检查为"完整".

有了这个设置,我在我的代码中使用了非常标准的Contract.Require().我不能把它放在try块中,因为它应该放在方法体的最顶层.所以,我的问题是当我不满足"Require()"条件时,我如何处理它可能抛出的异常?

通过正确的输入,我的代码运行良好,使用预期的错误输入,它会抛出一个无法解决的异常.我想我在这里的大局中缺少一些部分,或者我的项目的合同选项可能没有很好.

谢谢你的帮助.

c# code-contracts

3
推荐指数
1
解决办法
694
查看次数