【问题标题】:Design by contract/C# 4.0/avoiding ArgumentNullException按合同设计/C# 4.0/避免 ArgumentNullException
【发布时间】:2009-01-12 00:14:06
【问题描述】:

我已经厌倦了检查我所有的参数是否为 null,并在它们出现时抛出 ArgumenutNullExceptions。

据我了解,C# 4.0 支持按合同构造进行一些设计。是否可以在 C# 4.0 中指定方法不接受空参数?

另外,在此期间我能做些什么(也许是一个属性?)来避免检查 null 和抛出这种单调的任务?

【问题讨论】:

    标签: c#-4.0 argumentnullexception


    【解决方案1】:

    您可以创建一个有帮助的NotNull<T> 泛型类,但有一些副作用。见Robert Nystrom's blog post

    【讨论】:

      【解决方案2】:

      Rick Brewster 在这篇文章中描述了一个简洁的声明式参数检查的好解决方案,

      http://blog.getpaint.net/2008/12/06/a-fluent-approach-to-c-parameter-validation/

      避免使用反射(DbC 的缺点)并且不会为非异常代码路径创建开销。

      就像他如何使用扩展方法来允许对空对象调用实例方法一样。非常聪明的 IMO 编码。

      如果您在 DbC、Google Spec# 和 PostSharp 上销售。

      【讨论】:

        【解决方案3】:

        不确定 C# 4.0 中的原生 DbC 构造,但微软将发布跨语言 Contracts 库。
        您可以下载MSVS2008的版本here

        【讨论】:

          【解决方案4】:

          作为已经给出的答案的替代方案,值得研究Null Object design pattern.

          这种设计模式的本质是,一旦“空对象”被创建,就不再需要对空对象进行任何检查,空对象的方法实现了当空对象(否则)有被传递而不是对“真实对象”的引用。

          这种设计模式不依赖于 C# 4.0,实际上几乎可以用任何 OO 编程语言轻松实现

          【讨论】:

          • 这是一个很棒的模式,但它不会阻止调用者传递实际的空值。
          【解决方案5】:

          我刚刚开始使用 Code Contracts,它是 C# 4.0 中的一项新功能,您需要从 MS 下载插件才能在项目设置中看到它。详情在这里-> http://research.microsoft.com/en-us/projects/contracts/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-05-24
            • 1970-01-01
            • 1970-01-01
            • 2010-09-29
            • 2010-10-01
            • 2015-09-15
            • 1970-01-01
            相关资源
            最近更新 更多