这是我的代码:
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.Requires和Contract.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
将后置条件添加到返回的异步方法的推荐方法是什么Task<T>?
我已经阅读了以下建议:
http://social.msdn.microsoft.com/Forums/hu-HU/async/thread/52fc521c-473e-4bb2-a666-6c97a4dd3a39
帖子建议将每个方法实现为同步,签约,然后将异步对应实现为简单的包装器.不幸的是,我不认为这是一个可行的解决方案(也许是通过我自己的误解):
await其他异步方法的新方法因此被强制为异步.这些方法本质上是异步的,不能轻易转换为同步.它们不仅仅是包装纸.即使我们通过说我们可以使用.Result或.Wait()代替await(这实际上会导致某些SyncContexts死锁,并且无论如何都必须在异步方法中重写)来使后一点无效,我仍然相信第一点.
有没有其他想法,或者有什么我错过的代码合同和TPL?
我正在寻找提供保护方法的库或源代码,例如检查空参数.显然这个构建起来相当简单,但我想知道.NET是否还有.谷歌的基本搜索没有透露太多信息.
我正在引用这个答案(强调我的):
看看ContractClass和ContractClassFor属性.这允许您在单独的程序集中编写具有代码契约的类.这使您可以使合同可用于开发工作,不会使代码混乱,也意味着您不必使用实时代码部署合同
你为什么不想要部署合同?
从最佳实践角度来看,合同是否严格用于开发和质量控制?
我同意马克·西曼的观点,即自动属性在某种程度上是邪恶的,因为它们打破了封装.但是,我确实喜欢它们带来的简洁语法,可读性和便利性.
我引用:
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) 在阅读System.Diagnostics.Contracts.Contract了受Spec#令人敬畏的影响的静态类之后,我很激动,并立即开始通过调用Contract.Requires()和编写代码Contract.Ensures().
我想这只是因为我的代码是如此超级棒和无错误,检查那些调用实际做了什么直到最近才出现.一个错误滑过,我意识到这些电话没有做任何事情!我原以为他们至少会在违反条件时抛出异常,但没有这样的运气.
我错过了什么吗?有谁知道这是什么意思?
我研究了使用条件框架来验证数据而不是
if(cond) throw new SomeException();
SomeFramework.MakeSure(cond);
Run Code Online (Sandbox Code Playgroud)
最后,我的选择是使用CodeContract或CuttingEdge.Conditions框架.
我无法决定使用哪个框架.我可以告诉你,我不喜欢'CodeContract'框架,你必须安装额外msi的才能使用它以及你需要选择的选项; 不是那么糟糕,但感觉不自然.(当然它还在MS研究中.)
你怎么看?
我有以下方法:
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脚本构建的.有没有办法检查运行时并抛出异常,使用简单的命令或属性,或者简单的东西?
我正试图摆脱我的系统上的Code Contracts Tools扩展.我已经从"程序和功能"中卸载它,但它仍然显示为Visual Studio中的已安装扩展.
任何帮助,将不胜感激.
给定的代码
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很满意.