自動プロパティはカプセル化を破るので、やや悪であるというMarkSeemanの考えに同意します。しかし、私はそれらがもたらす簡潔な構文、読みやすさ、便利さが好きです。
私は引用します:
public string Name { get; set; }
コードスニペットの問題は、セレモニーが多すぎることではありません。問題は、カプセル化が壊れることです。実際には
「[…]ゲッターとセッターは、カプセル化や情報隠蔽を実現しません。これらは、言語に合法化された方法であり、それらに違反します。」</ p>
James O. Coplien&GertrudBjørnvig。リーンアーキテクチャ。ワイリー。2010.p。134。
ほとんどの場合、null以外のガード句を追加することは、プロパティセッターにとって十分であり、以下のいずれかよりも優れた方法があるかどうかを知りたいと思います。より良いのは、より簡潔で反復性の少ない方法を意味します。
コードコントラクトの使用:
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;
}
}