将列表设置为自身是否会影响性能?

本文关键字:影响 性能 是否 列表 设置 | 更新日期: 2023-09-27 18:12:03

我有一个列表,如果尚未实例化,可能是空的,我希望在调用GetList()时能够返回现有的或创建的列表,然后返回。这看起来更干净:

private List<object> m_objects;
public List<object> GetList()
{
    m_objects = m_objects ?? new List<object>();
    return m_objects;
}

但是设置list本身是否会影响性能,或者c#是否意识到这是不必要的?

可以是:

private List<object> m_objects;
public List<object> GetList()
{
    if(m_objects != null) 
    {
        return m_objects;
    }
    m_objects = new List<object>();
    return m_objects;
}

显然不是世界末日,但我还是很好奇。

将列表设置为自身是否会影响性能?

使用Lazy<T>:

private Lazy<List<object>> m_objects = new Lazy<List<object>>();
public List<object> GetList()
{
    return m_objects.Value;
}

解决性能问题。在这里担心性能是不成熟的优化。你应该先对它进行编码,让它正常工作,然后如果你发现任何与性能相关的问题,对它进行分析和优化。

这是完全正确的:

private List<string> items;
public List<string> Items { get { return items ?? (items = new List<string>()); } }

注意?? (items =的差异。没有性能影响,因为它是布尔短路在??,如果它有一个非空值。


如前所述,如果您想使用您的代码,那么YES,它确实会造成性能影响,因为每次都创建新元素

由于问题特别要求性能,因此在调用GetList()时,这将为您提供最佳性能,并且它是线程安全的:

private readonly List<object> m_objects = new List<object>();
public List<object> GetList()
{
    return m_objects;
}
另一个使它线程安全的选择是使用Lazy<T>。这延迟了new List<object>(),代价是始终执行new Lazy<List<object>>(),并且在GetList()方法中增加了额外的开销。

可能会有最小的性能影响,因为您基本上是将m_objects中保存的引用分配给m_objects字段。这实际上只是复制一个64或32位的指针。您不需要复制所有的数据,只需要复制对象实例的引用(或null)。

对于你的代码,我认为使用?? ?只要你不担心多线程,引言是非常整洁和充分的。如果你是,那么懒人建议@ michaowKędrzyński建议是更好的方法,因为你不需要编程所有这些。

唯一的例外是,由于UI的限制,您需要确保您在WPF中的Dispatcher线程或Winforms中的UI线程上。

编辑

只是纠正我自己的答案,如果你的泛型类型不是线程安全意识(例如,List不是线程安全),使用Lazy是没有意义的