关于C#中数组浅拷贝的问题

时间:2009-04-26 22:53:49

标签: c# arrays string shallow-copy

只是为了确保我正确理解引用类型的浅层副本,并且我没有在这里构建一个巨大的内存泄漏:

// Adds text to the beginning of the log RTB
// Also keeps the log RTB trimmed to 100 lines
var lines = new string[rtbLog.Lines.Length + 1];
lines[0] = "text";
Array.Copy(rtbLog.Lines, 0, lines, 1, rtbLog.Lines.Length);

if (lines.Length > 100)
{
    Array.Resize(ref lines, 100);
}

rtbLog.Lines = lines;

这首先将refs复制到rtbLog.Lines中的字符串为行。然后它会将前100个refs从行复制到一个新的字符串数组中。

表示rtbLog.Lines最初引用的数组,最初由行引用的数组(在调整大小之前),最后是行中没有包含的任何字符串(在调整大小之后),都​​会收集垃圾。 (我希望这是有道理的)

正确?

2 个答案:

答案 0 :(得分:1)

Array.Resize方法有点用词不当。它应该真的命名为CopyToNewArrayWithSize。在幕后,此API将创建一个新数组并将指定的数据复制到该数组中。然后通过引用返回新数组。

至于垃圾收集。通过将Lines属性重置为新数组,您成功删除了对该数组的原始引用。只要没有对数组的其他引用,它将在将来的某个时刻被垃圾收集。

答案 1 :(得分:0)

是的,原来的数组和不再使用的字符串被垃圾收集得很好。

如果在创建数组之前计算所需的大小,则不必调用Resize(因为这会创建另一个数组副本)。

// Adds text to the beginning of the log RTB
// Also keeps the log RTB trimmed to 100 lines
int size = Math.Min(rtbLog.Lines.Length + 1, 100);
string[] lines = new string[size];
lines[0] = "text";
Array.Copy(rtbLog.Lines, 0, lines, 1, size - 1);
rtbLog.Lines = lines;