【问题标题】:List<string>.Clear() vs List<string> = new List<string> in C# (possible ByReference issue?) [duplicate]C# 中的 List<string>.Clear() vs List<string> = new List<string> (可能是 ByReference 问题?)[重复]
【发布时间】:2021-04-04 02:49:54
【问题描述】:

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

在下面的代码中,当使用 List&lt;string&gt;.Clear() 和循环结束时,我有 486 个最后一个 List&lt;String&gt; 值的副本。我找到了一个修复(hack?)但我想知道为什么.Clear() 不能在我的List&lt;String&gt; 上工作。完整程序可以找到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>();

    }
   
}

【问题讨论】:

  • 是的,你是对的。另一个解决方案是:groups.Add(buffer.ToList()); buffer.Clear(),所以你先“克隆”List,然后再将其添加到groups。请注意,第四行中的buffer.Clear(); 是无用的。 buffer 已经很清楚了。并且要高兴,这是我每隔几个月就会犯的一个很常见的错误。没什么好羞愧的。

标签: c# list .net-core pass-by-reference


【解决方案1】:

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

因此,只有buffer.Clear()else 块在每次迭代时都会向groups 添加对相同列表实例的引用,这也被清空了。

【讨论】:

    猜你喜欢
    • 2014-07-22
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    相关资源
    最近更新 更多