アクセサはフィールド以上のものです。他の人はすでにいくつかの重要な違いを指摘しているので、もう1つ追加します。
プロパティはインターフェイスクラスに参加します。例えば:
interface IPerson
{
string FirstName { get; set; }
string LastName { get; set; }
}
このインターフェースは、いくつかの方法で満たすことができます。例えば:
class Person: IPerson
{
private string _name;
public string FirstName
{
get
{
return _name ?? string.Empty;
}
set
{
if (value == null)
throw new System.ArgumentNullException("value");
_name = value;
}
}
...
}
この実装では、両方を保護しています Person
クラスが無効な状態になること、および呼び出し側が割り当てられていないプロパティからnullを取得するからしています。
しかし、デザインをさらに推し進めることができます。たとえば、インターフェイスはセッターを処理しない場合があります。IPerson
インターフェースの消費者は、プロパティを設定するのではなく、プロパティを取得することにのみ関心があると言うのはかなり正当です。
interface IPerson
{
string FirstName { get; }
string LastName { get; }
}
Person
クラスの以前の実装はこのインターフェースを満たしています。呼び出し側もプロパティを設定できるという事実は、消費者(消費者)の観点からは無意味IPerson
です。具体的な実装の追加機能は、たとえばビルダーによって考慮されます。
class PersonBuilder: IPersonBuilder
{
IPerson BuildPerson(IContext context)
{
Person person = new Person();
person.FirstName = context.GetFirstName();
person.LastName = context.GetLastName();
return person;
}
}
...
void Consumer(IPersonBuilder builder, IContext context)
{
IPerson person = builder.BuildPerson(context);
Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
}
このコードでは、消費者はプロパティセッターについて知らない-それについて知ることは彼のビジネスではない。消費者はゲッターを必要とするだけで、インターフェースから、つまり契約からゲッターを取得します。
のもう1つの完全に有効な実装はIPerson
、不変のpersonクラスと対応するpersonファクトリです。
class Person: IPerson
{
public Person(string firstName, string lastName)
{
if (string.IsNullOrEmpty(firstName) || string.IsNullOrEmpty(lastName))
throw new System.ArgumentException();
this.FirstName = firstName;
this.LastName = lastName;
}
public string FirstName { get; private set; }
public string LastName { get; private set; }
}
...
class PersonFactory: IPersonFactory
{
public IPerson CreatePerson(string firstName, string lastName)
{
return new Person(firstName, lastName);
}
}
...
void Consumer(IPersonFactory factory)
{
IPerson person = factory.CreatePerson("John", "Doe");
Console.WriteLine("{0} {1}", person.FirstName, person.LastName);
}
このコードサンプルでは、コンシューマはプロパティを埋める知識がありません。コンシューマーはゲッターと具体的な実装(およびその背後にあるビジネスロジック(名前が空かどうかのテストなど)のみを処理します)は、専門のクラス(ビルダーとファクトリー)に任されています。これらの操作はすべてフィールドでは不可能です。