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
的引用,这也被清空了。
当我发现我的程序中有一个错误时,我正在做 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
的引用,这也被清空了。