2013-03-18 56 views
8

今天我读到了关于C#4.0代码契约的内容。这似乎是在验证参数的方法常见的做法是不为空如下:C#代码契约 - 避免检查空引用的参数

Contract.Requires(p != null); 

但是它似乎很不合理,我认为我必须为每一个接口方法的每一个参数做到这一点在我的代码中。在绝大多数情况下,参数预计不会为空。我预计会有某种机制允许定义一些特定参数为“允许”为null(类似于Java中的“@Nullable”注释),并且Contracts框架将自动确保其余部分不会空值。

除了在这个“样板检查”(以及许多“合同类”)上节省了大量时间外,它还可以使许多时候没有任何条件需要验证,除非非空参数)合同代码更清洁,更“逻辑导向”。

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

+0

它本来是有用的,但没有任何速记可以做到这一点,因为没有人改变语言规范来提供它,然后实现它并发布它。请参阅Eric Lippert在此处对类似问题的回复:http://stackoverflow.com/questions/2806894/why-c-sharp-doesnt-implement-indexed-properties – 2013-03-18 07:20:53

+0

您可以使用'crn'片段自动生成样板这些非空的语句,这减少了键入。 – 2013-03-31 19:56:50

回答

1

我不同意,当你需要检查某些东西是否还没有初始化,或者没有找到数据时,null非常有用,有时你会希望将null传递给方法,并且它的罚款,代码合同对于服务大量类的常用方法和API定义都很有用。如果您在分层体系结构中编写代码,则只需要保护各个层之间的交互,并且在每个层内您都是无效的。

你的域名有空,而且没关系。

+0

你误解了他。他在问为什么没有简短的说一个参数不允许为空。 – 2013-03-18 07:16:47

+0

“或者为什么我的方法在这里出错?” – 2013-03-18 07:17:33

+1

对不起,我应该说的是:他问为什么默认情况下不允许空值,但用一个简写说一个参数*被允许为空。他绝对是正确的,通常的情况是,不允许空值(至少,根据我的经验)。 – 2013-03-18 07:20:14