我一直在想这个问题,并且无法找到关于该主题的太多评论,也无法自己得出结论。
创建对象时,公认的最佳做法是尽可能限制对象的公开数据和允许操作该数据。如果您可以使对象不可变,尤其是在多线程应用程序中,那么最好这样做。
话虽如此,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;}