【问题标题】:Modifications of arrays passed by reference通过引用传递的数组的修改
【发布时间】:2010-09-23 02:51:04
【问题描述】:

我最近遇到了一些执行以下操作的第 3 方 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 引用以指向新分配的数组吗?如果是这样,该数组是否可以保证保留?

【问题讨论】:

  • 附带说明.. 您提到了 Array.Copy,在大多数情况下这很好,但是当您处理字节数组并且想要避免自动装箱和拆箱的开销时,您应该考虑Buffer.BlockCopy .. 不是真正的主题,但仅供参考

标签: c# arrays


【解决方案1】:

是的,因为 ref - 它确实修改了传递的引用。 停在附近?你的意思是 - 没有被摧毁?是的,由于有新的引用,它不会被 GC 处理。如果没有更多引用,则在此分配之后,旧数组(已通过)可能会被 GC...

Array.Copy 实际上会复制元素,那么你就不需要 "ref",但这会比较耗时

【讨论】:

    【解决方案2】:

    你猜对了,赋值是修改 byteData 数组引用以指向新分配的数组(因为 'ref' 关键字)。函数的调用者将“看到”recvData 数组的内容(无论那里填写什么)。

    是的,只要剩下一个对它的引用,数组就会一直存在(在这种情况下,无论你传递给这个函数的数组是什么)。

    【讨论】:

      【解决方案3】:

      该代码会将 recvdata 数组引用分配给 byteData 数组引用。 .NET 将在其垃圾收集逻辑的幕后跟踪分配,因此只要 byteData 在范围内,最初分配给 recvdata 的字节数组就不会消失。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2015-05-19
          • 2015-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-04
          • 2020-04-19
          相关资源
          最近更新 更多