C# 中的 List<string>.Clear() vs List<string> = new List<string> (可能是 ByReference 问题?)

List<string>.Clear() vs List<string> = new List<string> in C# (possible ByReference issue?)

当我发现我的程序中有一个错误时,我正在做 AoC 第六天挑战。

在下面的代码中,当使用 List<string>.Clear() 和循环结束时,我得到了最后一个 List<String> 值的 486 个副本。我找到了一个修复程序(hack?),但我想知道为什么 .Clear() 在我的 List<String> 上不起作用。可以找到完整的程序 here.

int result = 0;
List<List<string>> groups = new List<List<string>>();
List<string> buffer = new List<string>();
buffer.Clear();

foreach (string s in lineList)
{

    if (!string.IsNullOrEmpty(s))
    {
        buffer.Add(s);
    }
    else
    {
        groups.Add(buffer);

        //// old way
        //// was getting 487 copies of the last group
        // buffer.Clear

        // new way, works but I don't understand why
        // byref vs byval issue?
        buffer = new List<string>();

    }
   
}

Clear() 不创建新实例,Add() 不创建副本。

所以只有 buffer.Clear()else 块在每次迭代中添加对 相同列表实例 groups 的引用,这也被清空了。