我在下面编写此合同时显示错误.
错误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) 我最近在.Net Rocks show 570(http://devjourney.com/community/dotnet-rocks-show-570-with-kevin-hazzard/)上听了Kevin Hazzard关于代码合同的讨论.他提到启用运行时合同检查作为一些人可能选择使用的选项,而其他人可能不会.
为什么不对代码合同使用运行时合同检查?是否会对绩效产生重大负面影响?其他原因?
如果禁用此功能,如何在运行时处理方法中的前提条件?
在埃菲尔说,我们应该"放松前提条件并收紧后期条件",但我不确定这意味着什么.这种好处/如何受益于子类别?
谢谢
您好CodeContracts有一点问题.我有一个类库项目,它作为一个带有方法foo的类(字符串s1,字符串s2); 在foo方法中,我有一个Contract.Requires(s1!= null).因此,如果我理解我的代码的含义(是的,我刚刚安装了CodeContracts并使用:),合同将在构建过程和运行时检查s1!= null表达式,抛出ArgumentException>.我想测试行为,当我从类lib项目调用foo(null,"test")时,设计师告诉我这个问题,但是当我从winform app项目调用它时,我没有得到任何警告错误列表窗口.那么这是否意味着代码合同只适用于它们所在的项目而不是外部?谢谢
UPDATE
我忘了提到我添加的前提条件在静态分析中不起作用.但是,它们会在运行时使用适当的消息抛出ArgumentException.
我真的想在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时,我可以获得任何魔力,但是当我不安装时,这个命名空间的目的是什么?我可以将代码合同用于除开箱即用的精心评论之外的其他内容吗?
自从我开始在Visual Studio 2008(C#)中使用代码约定以来,构建我的dll的速度非常慢.我没有打开静态检查,但显然重写需要永远......
有没有办法解决这个问题,这将在未来版本的Microsoft Code Contracts中得到改进吗?
更新:在VS2008中构建时,即使在程序集的属性中关闭静态分析,它也会为每个dll运行静态分析...
前几天我看到了Code Contracts的演示,并决定在一个小测试项目中试一试.
在向类中添加"using System.Diagnostics.Contracts"语句后,我可以适当地设置我的代码合约代码,但似乎没有强制执行合同.
我没有看到项目属性屏幕上出现"代码合同"选项卡的原因吗?
我刚开始在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(...);
我有一个带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).
我已经开始使用Code Contracts for .NET了.
有了这个设置,我在我的代码中使用了非常标准的Contract.Require().我不能把它放在try块中,因为它应该放在方法体的最顶层.所以,我的问题是当我不满足"Require()"条件时,我如何处理它可能抛出的异常?
通过正确的输入,我的代码运行良好,使用预期的错误输入,它会抛出一个无法解决的异常.我想我在这里的大局中缺少一些部分,或者我的项目的合同选项可能没有很好.
谢谢你的帮助.