C# 代码契约 - 避免检查空引用的参数

Posted

技术标签:

【中文标题】C# 代码契约 - 避免检查空引用的参数【英文标题】:C# code contracts - avoiding checking parameters for null references 【发布时间】:2013-03-06 11:16:59 【问题描述】:

我今天阅读了有关 C# 4.0 代码合同的信息。似乎验证方法的参数不为空的常见做法如下:

Contract.Requires(p != null);

但是对我来说,我必须对代码中每个接口方法的每个参数都执行此操作似乎很不合理。在绝大多数情况下,参数不应为空。我希望会有某种机制允许定义某些特定参数“允许”为空(类似于 Java 中的“@Nullable”注释),并且合同框架将自动确保其余的不是空。

除了在这种“样板检查”(以及许多“合同类”上节省大量时间,因为很多时候除了非空参数之外根本没有任何条件需要验证)之外,它还会使合约代码更简洁,更“面向逻辑”。

我的问题是,有没有办法做到这一点,如果没有,哪里没有,或者为什么我的方法在这里是错误的?

【问题讨论】:

它会很有用,但是没有任何简写可以做到这一点,因为没有人更改语言规范以提供一个,然后实现它并发布它。请参阅 Eric Lippert 对类似问题的回复:***.com/questions/2806894/… 您可以使用crn sn-p 为这些非空语句自动生成样板,从而减少了一点输入。 【参考方案1】:

我不同意,当您需要检查某些内容是否尚未初始化或未找到数据时,null 非常有用,有时您希望将 null 传递给方法并且它很好,代码契约适用于为大量类提供服务的通用方法,也适用于 api 定义。如果您在分层架构中编写,您只需要保护层之间的交互,并且您在每个层内都是空安全的。

你的域有空值,没关系。

【讨论】:

你误会了他。他在问为什么没有简写来表示参数不允许为空。 对不起,我应该说的是:他在问为什么默认情况下不允许空值,而是用简写来表示参数 is 允许为空值。他绝对正确,正常情况是不允许使用空值(至少,根据我的经验)。 是的,我的意思是,他并没有要求完全禁止空值 - 只是要求 默认情况下 禁止空值,并在必要时提供允许它们的机制。 仅作记录:发明空引用的人 Tony Hoare 认为这是一个 "billion dollar mistake"。所以我我们至少应该三思而后行。 ;)

以上是关于C# 代码契约 - 避免检查空引用的参数的主要内容,如果未能解决你的问题,请参考以下文章

C# - 避免 LINQ ToDictionary 中的空指针

我可以告诉 C# 可空引用方法实际上是对字段的空检查吗

C#的未来:简化参数空值验证

避免空列表的默认参数的pythonic方法是啥?

有没有办法在 for-each 循环迭代开始之前避免空检查? [复制]

当数据网格行在网格中不可见时,如何避免空引用异常?