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,我们执行了所有的规则和政策,我们永远不会完成任何事情这不是复制品。我感兴趣的是在构造函数内部检查创建新实例,而不是检查简单的函数参数。相同的选项适用于这两种情况。