Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#中的代码契约和空检查_C#_C# 4.0_Code Contracts - Fatal编程技术网

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!");