それは依存します...多くの場合、例に含まれていないものに依存します。まず、プロパティ全体を自動実装プロパティに短縮できます。
public string FirstName { get; set; }
この場合、これは質問を無意味にします。それを超えて、問題は、プロパティに (現在または将来) 存在する可能性があるロジックの種類と、そのロジックをコンストラクターによって呼び出す必要があるかどうかに帰着します。
たとえば、プロパティは必要な値を内部的にチェックするか、またはその他の検証を実行しますか? このようなもの:
private string firstName;
public string FirstName
{
get { return firstName; }
set
{
if (string.IsNullOrWhiteSpace(value))
throw new ArgumentNullException("FirstName");
firstName = value;
}
}
このような場合、オブジェクトの構築時にロジックが適用されるように、バッキング フィールドではなくプロパティをコンストラクターで使用する必要があることは明らかです。
逆に、セッターにアクセスするときだけ使用し、オブジェクトを作成するときは使用しないロジックがある場合があります。私の頭の中では、場所に関する情報を保持するオブジェクトが 1 つの例として考えられます。これには Address プロパティと Coordinates プロパティが含まれる場合があり、それらのいずれかが変更されるたびに、新しい値を地理的に特定し、もう一方を更新するバックエンド プロセスが存在します。ただし、(おそらくデータベースから既存の Location を再構築する場合) 両方を受け入れるコンストラクターがあり、構築中に地理位置情報を実行しても意味がありません。その場合、プロパティではなくバッキング フィールドを設定します。
プロパティを使用しないという説得力のある理由がないため、一般的にはバッキング フィールドの代わりにプロパティを使用することを好みます。単純に、後ですべてのアクセサーが使用するロジックがこれらのプロパティに追加される可能性があるためです。また、プロパティにはバッキング フィールドよりも意味のある名前が付けられている可能性が高い (たとえば、FirstName
より読みやすく/意味がある_firstName
) ため、コードの残りの部分を可能な限り読みやすく保ち、より読みやすい名前を優先することが優先されます。 .