C#中的代码契约和空检查
在我的代码中,我经常这样做:C#中的代码契约和空检查,c#,c#-4.0,code-contracts,C#,C# 4.0,Code Contracts,在我的代码中,我经常这样做: myfunction (parameter p) { if(p == null) return; } 我将如何用代码契约来替换它 我感兴趣的是找出是否传入了null,并通过静态检查捕获它 我感兴趣的是,如果在测试过程中传入null,就会抛出一个契约异常 对于生产,我想退出函数 代码契约能做到这一点吗?这对代码契约有用吗?这些帖子有很多很好的选择 编辑:我第一次误读了你的帖子,以为你是在抛出一个例外或什么,直到我看到乔恩·斯基特的评论。我绝对建议至少使用链
myfunction (parameter p)
{
if(p == null)
return;
}
我将如何用代码契约来替换它
我感兴趣的是找出是否传入了null,并通过静态检查捕获它
我感兴趣的是,如果在测试过程中传入null,就会抛出一个契约异常
对于生产,我想退出函数
代码契约能做到这一点吗?这对代码契约有用吗?这些帖子有很多很好的选择
编辑:我第一次误读了你的帖子,以为你是在抛出一个例外或什么,直到我看到乔恩·斯基特的评论。我绝对建议至少使用链接问题中提供的众多方法中的一种
此处复制John Feminella的一个答案:
[Pure]
public static double GetDistance(Point p1, Point p2)
{
CodeContract.RequiresAlways(p1 != null);
CodeContract.RequiresAlways(p2 != null);
// ...
}
其语法为:
Contract.Requires(p != null);
这需要在方法的顶部。所有
合同。要求(和其他合同声明)必须在方法中的所有其他声明之前。在为我们的代码库研究代码合同时偶然发现了这个问题。这里的答案是不完整的。张贴此供将来参考
我将如何用代码契约来替换它
代码相当简单。用此行替换运行时空检查。这将抛出类型为System.Diagnostics.Contracts.ContractException
的异常(显然,除非捕获所有异常,否则您无法显式捕获该异常;它不是为在运行时捕获而设计的)
我感兴趣的是找出是否传入了null,并通过静态检查捕获它
您可以使用Microsoft插件进行代码契约静态分析
我感兴趣的是,如果在测试过程中传入null,就会抛出一个契约异常
从上面使用以下命令:
Contract.Requires(p != null);
或者,如果要引发不同的异常(例如ArgumentNullException
),可以执行以下操作:
Contract.Requires<ArgumentNullException>(p != null, "Hey developer, p is null! That's a bug!");
Contract.Requires
对于生产,我想退出函数
据我所知,在发布模式下构建项目将禁用代码契约检查(尽管您可以在项目属性中覆盖这一点)。所以,是的,你能做到
代码契约能做到这一点吗?这是代码契约的良好用途吗
简短回答-是。在使用真实数据运行时,为什么要有效地关闭安全检查?如果你的代码在生产环境中运行时出现错误,那么停止并中止你正在做的任何事情难道不是同样重要(如果不是更重要的话)吗?@Jon Skeet:最近有一个.Net Rocks播客,他们在其中与C#4.0代码合同的一位主要设计师交谈,他们问了同样的问题。我希望我能像他那样解释清楚,但恐怕我会弄错什么。他提出了一个非常有说服力的理由(不管怎样,当你在运行时检查契约时),说明为什么代码契约总体上更好。@Neil:我不反对代码契约。。。但是我也会让它们在生产过程中保持开启状态。@Neil:我会让合同保持活动状态,这样如果你输入了无效的参数,他们就会抛出异常。@Neil:是的,我不会关闭安全检查。这就是为什么我问OP为什么会关闭它们(只是返回而不是抛出异常)。没有CodeContract.RequiresAlways()-至少我在VS2013 C中没有看到这样的东西,它现在已经过时了,但仍然记录在代码中
Contract.Requires<ArgumentNullException>(p != null, "Hey developer, p is null! That's a bug!");