列表<字符串>。Clear() vs List<string> = 新的 List<string> 在 C# 中(可能是 ByReference 问题?[复制]

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

提问人:CryptoJones 提问时间:12/27/2020 最后编辑:xanatosCryptoJones 更新时间:12/27/2020 访问量:132

问:

当我在做 AoC 第六天挑战时,我注意到我的程序中有一个错误。

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

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>();

    }
   
}
C# 列表 .net-core 传递引用

评论

1赞 xanatos 12/27/2020
是的,你是对的。另一种解决方案是:因此,在将其添加到之前,您将“克隆”它。请注意,第四行中的 是无用的。这已经很清楚了。高兴吧,这是我每隔几个月就会犯的一个很常见的错误。没什么好羞愧的。groups.Add(buffer.ToList()); buffer.Clear()Listgroupsbuffer.Clear();buffer

答:

2赞 Joel Coehoorn 12/27/2020 #1

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

因此,只有 ,该块在每次迭代时都会添加对同一 List 实例的引用,该实例也被清空。buffer.Clear()elsegroups