c#列表属性初始化模式
本文关键字:模式 初始化 属性 列表 | 更新日期: 2023-09-27 18:11:29
我经常在日常代码中看到这两种初始化模式。我只是在找一个明确的原因,为什么你会选择其中一个而不是另一个,除了偏好?
模式1public 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;}
}
它们本质上是相同的。
它们是一回事。第二个是"语法糖",这意味着编译器基本上会为你处理重复的输入。
如果您需要访问后备变量,那么使用第一个。否则,使用第二种方法,让。net框架为您生成支持变量。
虽然,我要说的是,公开IList
作为一个公共属性并不总是一个好主意,因为你打开你的类的列表完全修改。如果您只想公开IList
的内容,请考虑实现一个枚举器。
模式2正在使用auto属性。如果你不需要访问后备字段,那么就不要放一个进去。你可以稍后再添加。这是一种封装形式。
如果变量需要一个默认值,我通常使用以下模式:
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之外的其他枚举,如ObservableCollection,甚至纯数组(User[])
它可能有一些代码气味,但我更喜欢它比有一个具体的List对象。