从函数返回总是新列表?

时间:2015-09-14 16:44:55

标签: c# .net

我需要为一个类创建一个公共函数,其中该函数返回一个List项,例如List(员工)。

此课程将从本课程以外频繁调用。

从内存消费的角度来看,最好是:

  1. 在此函数中始终初始化新列表,向其中添加项目并返回此列表或;
  2. 将一个列表存储在一个字段中,清除其中的项目,添加新项目并返回此列表
  3. 代码示例:

    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;
    }
    

    在内存消耗方面,上述哪个更受欢迎?在什么情况下应该使用上述之一而不是其他选项?

4 个答案:

答案 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")
  }; 
}