字段有义务的义务

时间:2011-07-17 18:36:34

标签: c# design-patterns

  

可能重复:
  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应该总是有一些名字?我不能在构造函数中做这样的检查,因为无论如何都会创建实例。我应该使用一些模式(使用私有构造函数和添加方法来生成实例......不知道这个模式是如何调用的)或者是否有任何语言支持来执行此操作?

感谢。

2 个答案:

答案 0 :(得分:5)

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

  

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

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

User user = null;

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

答案 1 :(得分:3)

有两种解决方案:

  • NULL值的情况下,在构造函数处抛出异常。这通常被认为是一件坏事。 (根据Jeffrey Richter的书)
  • 代码合同