使用代码契约指定返回值可能为空

发布于 2025-01-06 07:18:16 字数 180 浏览 0 评论 0 原文

有没有一种方法可以使用代码契约显式指定返回值可以为空?

我担心的是,没有 Contract.Ensures(Contract.Result() != null) 的方法将来可能会被错误地“修复”以包含后置条件,即使原始方法也是如此意图可能是允许空结果。

Is there a way of explicitly specifying that a return value can be null using Code Contracts?

My worry is that methods without a Contract.Ensures(Contract.Result<object>() != null) may be incorrectly 'fixed' in the future to include the post-condition, even though the original intention may have been to allow null results.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

↙厌世 2025-01-13 07:18:16

如果存在任何其他后置条件,则这些后置条件将指示 null 是有效的返回值。例如,如果某个方法应返回正值,但在发生错误时使用 null

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

不过,如果您担心回归,最好的解决方案可能是添加单元测试< /strong> 为预期的 null 返回值。

If there are any other post-conditions then these will indicate that null is a valid return value. For example, if a method should return a positive value but uses null if an error occurs:

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

If you're worried about regression, though, the best solution might be to add a unit test for an expected null return value.

臻嫒无言 2025-01-13 07:18:16

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

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

这对于类上可以为空的属性非常有用(例如,尚未做出/可以删除用户决定的情况),但分配的是数据对象,这意味着不适合使用空对象模式。我们在我正在从事的一个项目中就有这样一个项目,它总是让新编码员绊倒,他们没有意识到它可以为空。

If you are using resharper you can get it to produce warnings by marking methods with the CanBeNull attribute as described here: http://blogs.jetbrains.com/dotnet/2010/11/resharper-nullreferenceexception-analysis-and-its-contracts/

Its done using some resharper classes, but convieniently you dont have to reference a library - theres a button in the options to let you get your hands on the annotations. Little thing to be careful of: you need to keep the namespace they are in the same - it appears the actual marking is done by fully qualified name (so putting the classes in your own ns and using them wont produce the warnings you want).

This is very useful for properties that can be null on classes (eg where a user decision is yet to be made/can be removed) but where the assignment is a data object that means it is inappropriate to use the null object pattern. We've got one of those in a project im working on which always trips up new coders who dont realise it can be null.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文