【问题标题】:Obligation for field to have a value [duplicate]字段具有值的义务[重复]
【发布时间】:2011-07-17 18:36:33
【问题描述】:

可能重复:
Mark parameters as NOT nullable in C#/.NET?

例如,我有一个包含一个字段的简单类:

class User
{
    private readonly string _name;

    public User(string name)
    {
        _name = name;
    }

    public string Name { get { return _name; } }
}

如何禁止将name 参数设置为null,因为User 应该总是有一些名字?我不能在构造函数中进行这样的检查,因为无论如何都会创建实例。我应该使用一些模式(制作私有构造函数并添加方法来生成实例......不知道这个模式是如何调用的)还是有任何语言支持来做这个技巧?

谢谢。

【问题讨论】:

  • 不是重复的。我对创建新实例(检查构造函数内部)感兴趣,而不是检查简单的函数参数。
  • 相同的选项适用于这两种情况。

标签: c# design-patterns


【解决方案1】:

在构造函数中检查:如果name 参数是null,则抛出ArgumentNullException

我不能在构造函数中做这样的检查,因为无论如何都是实例 将被创建。

如果构造函数抛出异常,则不会创建对象实例,因此您不必担心用户无效:

User user = null;

try
{
     user = new User(null); //throws ArgumentNullException
}
catch (ArgumentNullException)
{
    //user == null is true.
}

【讨论】:

    【解决方案2】:

    有两种解决方案:

    • NULL 值的情况下在构造函数中引发异常。这通常被认为是一件坏事。 (根据杰弗里·里希特的书)
    • 代码合同

    【讨论】:

    • 为什么它通常被认为是一件坏事?代码契约也是如此。
    • 从什么时候开始从 ctor 抛出异常被认为是不好的? o.O
    • 给我几分钟,我正在寻找链接
    • 通过 c# 在 Jeff Richter 的 CLR 中
    • 如果我们执行所有规则和政策,我们将永远无法完成任何事情。 :)
    猜你喜欢
    • 2014-09-15
    • 1970-01-01
    • 2021-03-09
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多