【发布时间】:2009-01-12 00:14:06
【问题描述】:
我已经厌倦了检查我所有的参数是否为 null,并在它们出现时抛出 ArgumenutNullExceptions。
据我了解,C# 4.0 支持按合同构造进行一些设计。是否可以在 C# 4.0 中指定方法不接受空参数?
另外,在此期间我能做些什么(也许是一个属性?)来避免检查 null 和抛出这种单调的任务?
【问题讨论】:
标签: c#-4.0 argumentnullexception
我已经厌倦了检查我所有的参数是否为 null,并在它们出现时抛出 ArgumenutNullExceptions。
据我了解,C# 4.0 支持按合同构造进行一些设计。是否可以在 C# 4.0 中指定方法不接受空参数?
另外,在此期间我能做些什么(也许是一个属性?)来避免检查 null 和抛出这种单调的任务?
【问题讨论】:
标签: c#-4.0 argumentnullexception
您可以创建一个有帮助的NotNull<T> 泛型类,但有一些副作用。见Robert Nystrom's blog post。
【讨论】:
Rick Brewster 在这篇文章中描述了一个简洁的声明式参数检查的好解决方案,
http://blog.getpaint.net/2008/12/06/a-fluent-approach-to-c-parameter-validation/
避免使用反射(DbC 的缺点)并且不会为非异常代码路径创建开销。
就像他如何使用扩展方法来允许对空对象调用实例方法一样。非常聪明的 IMO 编码。
如果您在 DbC、Google Spec# 和 PostSharp 上销售。
【讨论】:
作为已经给出的答案的替代方案,值得研究Null Object design pattern.
这种设计模式的本质是,一旦“空对象”被创建,就不再需要对空对象进行任何检查,空对象的方法实现了当空对象(否则)有被传递而不是对“真实对象”的引用。
这种设计模式不依赖于 C# 4.0,实际上几乎可以用任何 OO 编程语言轻松实现。
【讨论】:
我刚刚开始使用 Code Contracts,它是 C# 4.0 中的一项新功能,您需要从 MS 下载插件才能在项目设置中看到它。详情在这里-> http://research.microsoft.com/en-us/projects/contracts/
【讨论】: