【发布时间】:2015-09-14 16:44:54
【问题描述】:
我需要为一个类创建一个公共函数,该函数返回一个 List 的项目,例如 List(of employee)。
这个函数会在这个类之外被频繁调用。
从内存消耗来看,是不是更好:
- 在此函数中始终初始化新列表,向其中添加项目并返回此列表,或者;
- 在字段中存储一个列表,从中清除项目,添加新项目并返回此列表
代码示例:
1.
public List<employee> GetItems()
{
List<employee> list = new List<employee>();
list.Add(new employee());
list.Add(new employee());
....
return list;
}
2.
private List<employee> _list = new List<employee>();
public List<employee> GetItems()
{
_list.Clear();
_list.Add(new employee());
_list.Add(new employee());
...
return _list;
}
就内存消耗而言,上述之一是否更受欢迎?在什么情况下应该使用上述一种而不是另一种?
【问题讨论】:
-
两者看起来都很可疑——你不应该返回一个可变集合。特别是在第二种情况下 - 有人可能会修改列表,并且您会为不同的调用得到不同的结果。使用
IEnumerable<T>。话虽如此,这似乎有点过于宽泛和基于意见。 -
我不认为从 API 的角度来看
2。当另一个类调用GetItems时,任何从GetItems获取引用的地方都会清除并重置其列表?奇怪且很可能容易出错。也许有一个名字可以使这有意义,但我想不出一个。不过,从您的示例来看,也许您应该查看iterators。 -
大概您的意思是选项 2 中的
return _list,在这种情况下您正在破坏封装。像这里的其他人一样,我会远离那个选项。 -
@BartoszKP 如果集合是不可变的,则选项二是不可能的。
-
@BartoszKP 如果想要不变性并且底层结构是
List<T>,我可能宁愿选择IReadonlyList<T>