我最近遇到了一些第三方C#代码,它执行以下操作:
public int RecvByteDataFromPrinter(ref byte[] byteData)
{
byte[] recvdata = new byte[1024];
///...fills recvdata array...
byteData = recvdata;
return SUCCESS;
}
“byteData = recvdata
”行在这种情况下实际上做了什么?
似乎目标是让byteData包含recvdata数组的内容。但是,我认为您需要执行Array.Copy(...)
操作才能实现此目的。
这实际上是在修改byteData引用以指向新分配的数组吗?如果是这样,该阵列是否可以保留?
答案 0 :(得分:7)
是的,因为引用 - 它确实修改了传递的引用。 停在附近?你的意思是 - 没有被破坏?是的,由于新的参考,它不会是GC'd。如果没有更多的引用,那么旧的数组(已传递)可能是GC,但是没有更多的引用......
Array.Copy实际上会复制元素,然后你不需要“ref”,但这会更耗时
答案 1 :(得分:2)
你猜对了,赋值是修改byteData数组引用以指向新分配的数组(因为'ref'关键字)。该函数的调用者将“看到”recvData数组的内容(那里填充的内容)。
是的,只要有一个对它的引用,数组就会一直存在(在这种情况下,你传递给这个函数的数组)。
答案 2 :(得分:1)
该代码将recvdata数组引用分配给byteData数组引用。 .NET将在其垃圾收集逻辑的掩护下跟踪赋值,这样只要byteData在范围内,最初分配给recvdata的字节数组就不会消失。
答案 3 :(得分:0)
byteData引用现在将指向recvdata数组,为它提供根。它将“坚持”直到它的所有根都消失了(即被调用去除了传入的byteData对象)并且它变成了候选集合。一旦方法返回,传递的原始数组对象就是候选者。