我需要为一个类创建一个公共函数,其中该函数返回一个List
项,例如List(员工)。
此课程将从本课程以外频繁调用。
从内存消费的角度来看,最好是:
代码示例:
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;
}
在内存消耗方面,上述哪个更受欢迎?在什么情况下应该使用上述之一而不是其他选项?
答案 0 :(得分:12)
第二个选项将使用更少的内存。可能批次较少(由于您可能尚未考虑过某些行为)。
第一个示例将一个实际的新对象返回给调用者。由于局部变量立即超出范围,因此对象的生命周期将由调用者确定。因此,它将使用更多内存,因为会创建更多对象,即使它们被快速销毁,GC也不会立即收集它们。
第二个选项只有一个对象,因此使用更少的内存。 然而这意味着所有来电者都会将指向同一个对象。因此,每次清除和添加时,它都会影响所有以前的来电者,除非他们制作副本。此外,如果多个线程使用此类,则存在较大的线程危险。
第二个选项,虽然使用较少的内存,但极危险代码,我对使用它非常犹豫。
答案 1 :(得分:4)
永远不要做选项二。请记住,您将返回相同的参考。因此,当您清除列表时,其他人可能会尝试迭代它。这将导致例外。
在您返回列表后,您无法控制其他人对其执行的操作,例如添加/删除项目将影响从该功能获取列表的所有呼叫者。
答案 2 :(得分:1)
这两个例子并不等同。在第二个示例中,您将返回对同一列表的引用。
第一种方法总会返回一个唯一的对象,这可能是你想要的。
答案 3 :(得分:0)
正如许多受访者所说,选择选择1.另外,正如@BartoszKP所述,我可能会返回IEnumerable。您可以通过快捷方式初始化来节省一些按键。您可以按如下方式表达代码:
public IEnumerable<employee> GetItems()
{
return new List<employee> {
new employee("Alan"),
new employee("Bob"),
new employee("Carla")
};
}