C# 通过引用传递的数组的修改

C# 通过引用传递的数组的修改,c#,arrays,C#,Arrays,我最近遇到了一些第三方C#代码,它执行以下操作: public int RecvByteDataFromPrinter(ref byte[] byteData) { byte[] recvdata = new byte[1024]; ///...fills recvdata array... byteData = recvdata; return SUCCESS; } 在这种情况下,“byteData=recvdata”行实际上做了什么 似乎目

我最近遇到了一些第三方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引用以指向新分配的数组吗?如果是这样的话,这个数组是否保证能保持不变?

是的,因为ref-它确实修改了传递的引用。 留下来?你是说,没有被摧毁?是的,由于新的引用,它将不会被GC'd。如果没有更多引用,则在此分配之后旧数组(已传递)可能会被GC删除


Copy实际上会复制元素,因此您不需要“ref”,但这将更加耗时

byteData引用现在将指向recvdata数组,为其提供一个根。它将“停留”直到它的所有根都消失(即被调用的对象摆脱传入的byteData对象),并成为集合候选对象。一旦方法返回,传递的原始数组对象就是收集的候选对象。

该代码将把recvdata数组引用分配给byteData数组引用。NET将在其垃圾收集逻辑的掩护下跟踪分配,这样,只要byteData在范围内,最初分配给recvdata的字节数组就不会消失在您的下方。

您猜对了,分配正在修改byteData数组引用以指向新分配的数组(因为'ref'关键字)。函数的调用者将“看到”recvData数组的内容(其中填充的内容)


是的,只要只剩下一个对它的引用,数组就会一直存在(在本例中,不管传递给这个函数的数组是什么)作为一个旁注,你提到了数组。拷贝,在大多数情况下是很好的,但是当你处理字节数组并且想要避免自动装箱和解压的开销时,你应该考虑缓冲区。