我总是看到每天代码中使用的这两种初始化模式。我只是在寻找一个明确的理由,为什么你会选择一个而不是偏好?
模式1
public class School
{
private List<User> _users;
public School()
{
_users = new List<User>();
}
public List<User> Users
{
get
{
return _users;
}
set
{
_users = value;
}
}
}
模式2
public class School
{
public School()
{
this.Users = new List<User>();
}
public List<User> Users { get; set;}
}
答案 0 :(得分:4)
它们基本相同。如果你在get或set中做任何特别的事情,第一个只会有所不同,否则第二个更紧凑,更容易阅读。
答案 1 :(得分:1)
他们是一回事。第二个是“语法糖”,这意味着编译器基本上会为你重复打字。
答案 2 :(得分:1)
如果您需要访问支持变量,请使用第一个。否则,使用第二个,让.NET框架为您生成支持变量。
虽然,我会说,将IList
作为公共财产公开并不总是一个好主意,因为你打开你的班级列表进行全面修改。如果您要做的只是公开IList
的内容,请考虑实施enumerator。
答案 3 :(得分:0)
模式2使用自动属性。如果您不需要访问支持字段,则不要将其放入。您可以随时添加。这是一种封装形式。
答案 4 :(得分:0)
如果变量需要默认值,通常我使用这种模式:
public class School
{
private List<User> _users = new List<Users>();
public List<User> Users
{
get
{
return _users;
}
set
{
_users = value;
}
}
}
至少在我学习API设计之前。在那之后,通常我使用这种模式(这可能与David Hoerster的回答有关):
public class School
{
List<User> _users = new List<Users>();
public IEnumerable<User> Users
{
get
{
return _users;
}
set
{
_users.Clean();
_users.AddRange(value);
}
}
public void AddUser(User user){
_users.Add(user);
}
}
一些原因:
虽然它可能有一些代码味道,但我更喜欢它比拥有一个具体的List对象更好。