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

C# 关于C中数组浅拷贝的问题#,c#,arrays,string,shallow-copy,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.L

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

// 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;
这将首先将引用复制到rtbLog.line中的字符串中,并将其复制到行中。然后,它会将行中的前100个引用复制到一个新的字符串数组中

这意味着rtbLog.Lines最初引用的数组,最初由行引用的数组(在调整大小之前),以及最后所有未包含在行中的字符串(在调整大小之后),都会被垃圾回收。(我希望这是有道理的)


正确吗?

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


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

是的,不再使用的原始数组和字符串可以进行垃圾收集

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

“是”就足够了,但谢谢你花时间用另一种方式解释!)只要我从末尾“弹出”的字符串得到GC'ed(当然前提是它们没有在其他地方引用),我就很高兴。
// 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;