我同意 Mark Seeman 的观点,即自动属性在破坏封装时有些邪恶。不过,我确实喜欢它们带来的简洁语法、可读性和便利性。
我引用:
public string Name { get; set; }
代码片段的问题不在于它包含太多仪式。问题是它破坏了封装。实际上
“[...] getter 和 setter 没有实现封装或信息隐藏:它们是一种语言合法化的违反它们的方式。”</p>
James O. Coplien & Gertrud Bjørnvig。精益架构。威利。2010 年。134.
大多数情况下,添加非空保护子句对于属性设置器来说已经足够了,我想知道是否有比以下方法更好的方法。更好,我的意思是更简洁/更少重复的方式。
使用代码契约:
private string _username;
public virtual string Username
{
get { return _username; }
set
{
Contract.Requires(value != null);
_username = value;
}
}
使用香草 .NET:
private string _username;
public virtual string Username
{
get { return _username; }
set
{
if (value == null) throw new ArgumentNullException("Username");
_username = value;
}
}