使用代码约定指定返回值可以为null

时间:2012-02-16 18:24:06

标签: c# .net code-contracts

有没有办法使用代码合约明确指定返回值 为空?

我担心没有Contract.Ensures(Contract.Result<object>() != null)的方法可能会被错误地修复&#39;在未来包括后置条件,即使最初的意图可能是允许空结果。

2 个答案:

答案 0 :(得分:9)

如果有任何其他后置条件,那么这些将表明null是有效的返回值。例如,如果方法应返回正值,但如果发生错误则使用null

Contract.Ensures(Contract.Result<int?>() == null || 0 <= Contract.Result<int?>());

如果您担心回归,最佳解决方案可能是为预期的null返回值添加单元测试

答案 1 :(得分:3)

如果您正在使用resharper,可以通过使用CanBeNull属性标记方法来获取警告,如下所述:http://blogs.jetbrains.com/dotnet/2010/11/resharper-nullreferenceexception-analysis-and-its-contracts/

使用一些resharper类完成它,但是很方便你不必引用一个库 - 选项中的一个按钮让你可以获得注释。需要注意的一点是:你需要保持它们所在的命名空间 - 看起来实际的标记是由完全限定的名称完成的(因此将类放在你自己的ns中并使用它们不会产生你想要的警告)。

这对于可以在类上为null的属性非常有用(例如,尚未进行用户决策/可以删除)但是赋值是数据对象意味着使用null对象模式是不合适的。我们在一个正在进行的项目中有一个人总是绊倒那些没有意识到它可以为空的新编码员。