编译器会优化两次创建此列表吗?

mpe*_*pen 4 c# compiler-construction optimization

public SharpQuery Add(params HtmlNode[] elements)
{
    var nodes = new List<HtmlNode>(_context.Count + elements.Length);
    nodes.AddRange(_context);
    nodes.AddRange(elements);
    return new SharpQuery(nodes, this);
}

public SharpQuery(IEnumerable<HtmlNode> nodes, SharpQuery previous = null)
{
    if (nodes == null) throw new ArgumentNullException("nodes");
    _previous = previous;
    _context = new List<HtmlNode>(nodes);
}
Run Code Online (Sandbox Code Playgroud)

我有一大堆函数创建一个新的List<T>,向它添加一堆节点,然后将它传递给构造函数,该构造函数接受列表,并用它创建另一个新列表.

编译器是否足够聪明,可以确定它不需要两次创建列表?

Mar*_*ell 5

它不是"足够聪明"的情况 - 编译器按照它所说的去做; 你告诉它创建多个列表:它将创建多个列表.

但是,由于你及时发布它们,它们应该相当干净地收集,希望gen-0.因此,除非你在紧密循环中这样做,否则我不会对此感到太兴奋.

如果你想避免列表,你可以考虑LINQ Concat,它允许你附加序列而不需要任何额外的列表/集合等.