C#中的代码约定和空检查

时间:2011-01-14 19:52:42

标签: c# c#-4.0 code-contracts

在我的代码中,我做了很多:

myfunction (parameter p)
{
  if(p == null)
   return;
}

我如何用代码合同替换它?

我有兴趣找出是否传入了null并通过静态检查捕获它。

如果在测试期间传入null,我有兴趣抛出合同异常

对于制作我想退出该功能。

代码合同可以做到这一点吗?这对代码合同有用吗?

3 个答案:

答案 0 :(得分:5)

这个的语法是:

Contract.Requires(p != null);

这需要在方法的顶部。所有Contract.Requires(和其他合同语句)必须在方法中的所有其他语句之前。

答案 1 :(得分:1)

这些帖子herehere有很多不错的选择。

编辑:我第一次误读你的帖子,以为你在抛出一个ArgumentNullException或其他东西,直到我看到Jon Skeet的评论。我肯定建议至少使用链接问题中提供的众多方法中的一种。

在此重复John Feminella的答案之一:

[Pure]
public static double GetDistance(Point p1, Point p2)
{
    CodeContract.RequiresAlways(p1 != null);
    CodeContract.RequiresAlways(p2 != null); 
    // ...
}

答案 2 :(得分:1)

在研究代码库的代码合同时偶然发现了这个问题。这里的答案是不完整的。发布此信息以供将来参考。

  

我如何用代码合同替换它?

代码非常简单。用此行替换运行时null检查。这将抛出类型System.Diagnostics.Contracts.ContractException的异常(您显然无法明确捕获,除非您捕获所有异常;它不是设计为在运行时捕获)。

Contract.Requires(p != null);
  

我有兴趣了解是否已传入null并通过静态检查捕获它。

您可以使用Microsoft插件进行代码合同静态分析found here

  

我有兴趣在测试过程中传入null时抛出合约异常

从上面使用以下内容:

Contract.Requires(p != null);

或者,如果要抛出其他异常(例如ArgumentNullException),可以执行以下操作:

Contract.Requires<ArgumentNullException>(p != null, "Hey developer, p is null! That's a bug!");

但是,这需要代码合同二进制重写器,它包含在Code Contract plugin中。

  

对于制作我想退出该功能。

根据我的理解,在发布模式下构建项目将禁用代码合同检查(尽管您可以在项目属性中覆盖它)。所以是的,你可以这样做。

  

代码合同可以做到这一点吗?这对代码合同有用吗?

简短回答 - 是的。