私はこれについてしばらく疑問に思っていましたが、この件に関する多くの解説を見つけることができず、自分で結論を出すことができませんでした.
オブジェクトを作成するときは、データを公開し、そのデータを操作できるようにするという点で、オブジェクトをできるだけ制限することがベスト プラクティスとして認められています。特にマルチスレッド アプリケーションで、オブジェクトを不変にできる場合は、そうすることをお勧めします。
そうは言っても、C# は、クラスの定義をはるかに単純にし、さらに重要なことに、保守を容易にすることで、この規則に従わない開発者に有利に働くようです。
次の読み取り専用の不変クラスを取ります。
public class ActiveDirectoryUser
{
private readonly string firstName, lastName, office, username, email;
public ActiveDirectoryUser(string firstName, string lastName, string office, string username, string email)
{
this.firstName = firstName;
this.lastName = lastName;
this.office = office;
this.username = username;
this.email = email;
}
public string FirstName
{
get { return firstName; }
}
public string LastName
{
get { return lastName; }
}
...
public string Email
{
get { return email; }
}
}
そして、読み取り専用ではない、以下のはるかに単純な例と比較してください。
public class ActiveDirectoryUser
{
public string FirstName
{
get;
set;
}
public string LastName
{
get;
set;
}
...
public string Email
{
get;
set;
}
}
以下でインスタンス化できるものは次のとおりです。
ActiveDirectoryUser user =
new ActiveDirectoryUser
{ FirstName= "Sam", LastName = "Shiles", ..., Email ="Sam@shiles.com" };
より単純な定義を考えると、コードの行が少なくなればなるほど、開発者のエラーの可能性が減り、別の開発者がコードを簡単に理解できるようになります (特に、単純な例よりも実際に近い例では)、適切なコードを作成する価値があります。コストに見合うだけの読み取り専用の不変オブジェクト?
また、他の人は、C# で不変オブジェクトを作成することは、次のような自動 esq 構文を使用して簡単にする必要があると信じていますか?
public string FirstName {get; readonly set;}