在我的代码中,我做了很多:
myfunction (parameter p)
{
if(p == null)
return;
}
我如何用代码合同替换它?
我有兴趣找出是否传入了null并通过静态检查捕获它。
如果在测试期间传入null,我有兴趣抛出合同异常
对于制作我想退出该功能。
代码合同可以做到这一点吗?这对代码合同有用吗?
答案 0 :(得分:5)
这个的语法是:
Contract.Requires(p != null);
这需要在方法的顶部。所有Contract.Requires
(和其他合同语句)必须在方法中的所有其他语句之前。
答案 1 :(得分:1)
编辑:我第一次误读你的帖子,以为你在抛出一个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中。
对于制作我想退出该功能。
根据我的理解,在发布模式下构建项目将禁用代码合同检查(尽管您可以在项目属性中覆盖它)。所以是的,你可以这样做。
代码合同可以做到这一点吗?这对代码合同有用吗?
简短回答 - 是的。