C# 字段有值的义务

C# 字段有值的义务,c#,design-patterns,C#,Design Patterns,可能重复: 例如,我有一个带有一个字段的简单类: class User { private readonly string _name; public User(string name) { _name = name; } public string Name { get { return _name; } } } 如何禁止将name参数设置为null,因为用户应该总是有一些名称?我无法在构造函数内执行此类检查,因为无论如何都会创建

可能重复:

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

class User
{
    private readonly string _name;

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

    public string Name { get { return _name; } }
}
如何禁止将name参数设置为null,因为用户应该总是有一些名称?我无法在构造函数内执行此类检查,因为无论如何都会创建实例。我是否应该使用一些模式生成私有构造函数并添加方法来生成实例。。。不知道这个模式是如何调用的,或者有任何语言支持来实现这个技巧


谢谢。

有两种解决方案:

如果为空值,则在构造函数处引发异常。这通常被认为是一件坏事。根据杰弗里·里克特的书 代码合同
在构造函数中执行检查:如果name参数为null,则抛出ArgumentNullException

我无法在构造函数中进行这样的检查,因为不管怎样 将创建

如果构造函数引发异常,则不会创建对象实例,这样您就不必担心用户无效:

User user = null;

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

为什么人们普遍认为这是一件坏事?代码契约也是如此。从什么时候开始,从ctor抛出异常被认为是错误的?o、 给我几分钟时间,我正在试图找到杰夫·里克特的CLR中的链接。通过cIf,我们执行了所有的规则和政策,我们永远不会完成任何事情这不是复制品。我感兴趣的是在构造函数内部检查创建新实例,而不是检查简单的函数参数。相同的选项适用于这两种情况。