【问题标题】:C# - Effect of returning byte array of memory stream just before disposing stream?C# - 在处理流之前返回内存流的字节数组的效果?
【发布时间】:2016-03-31 12:06:09
【问题描述】:

我正在使用这样的内存流:

public static byte[] myMethod()
{
    using(MemoryStream stream = new MemoryStream())
    {
       //some processing here.
       return stream.toArray();
    }
}

我在调用者方法中分配返回的字节数组,如下所示:

public static void callerMethod()
{
    byte[] myData = myMethod();
   //Some processing on data array here
}

返回的字节数组是按引用传递还是按值传递?如果返回的数组是按引用的,这是否意味着我在任何时候都可能在 callerMethod 数组中有 myDatanull 在我仍在处理数据的任何时候?

【问题讨论】:

  • 字节数组应该如何改变'当你还在处理'?如果还没有分配,怎么改?
  • 您在询问处理流后数组是否为空?那不会发生。
  • 它是通过调用myMethod()分配的,我猜如果字节数组是通过引用返回的,它会改变,因为内存流对象现在将在执行退出后的任何时候成为GC的主题使用在被调用的方法中阻塞?
  • 谢谢@Rinecamo,是的,这正是我所要求的。
  • ToArray() 返回一个新数组,其中填充了流数据,因此您可以安全地处理流而不会丢失数据数组

标签: c# arrays stream dispose memorystream


【解决方案1】:

返回的字节数组是按引用传递还是按值传递?

数组是Array 类的一个实例,所以它始终是一个引用,没有值。 ToArray 从流中读取值并将它们存储在新实例化的数组对象中。

这是否意味着我在任何时候都可能... null

没有。如上所述,您返回一个新的数组实例,其中包含从流中读取的值。在您使用它时,您的局部变量 myData 不可能再次设置为 null

【讨论】:

    【解决方案2】:

    这将是一个参考,但您的数据将存储在您的内存中的某个位置。 因此,当“myMethod”返回时,流将被关闭,但您的数组仍将包含数据。 您的数组可能为 null 的唯一方法是您的流不包含任何数据。

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多