【问题标题】:C# memory handling for methods方法的 C# 内存处理
【发布时间】:2014-12-03 04:54:53
【问题描述】:

我对 C# 函数或方法在某些对象用作输入参数时处理内存的方式有疑问。我已经尝试搜索此问题的答案,但找不到任何东西,但我可能不知道要寻找什么。

问题:假设我有一个非常大的整数数组,大小为 10.000 x 10.000,称为“MyArray”。假设我还有一些名为“MyMethod”的方法,它从 MyArray 的两个指定行(这是输入)中获取多个条目,并对其执行一些操作,例如添加或乘以这些数字,然后返回另一个整数。

为了让我的代码尽可能短,我更喜欢创建一个方法

MyMethod(int i, int j, int[][] MyArray)

而不必输入数组中的所有数字作为单独的参数。然而,这是否意味着该方法在调用时会创建 MyArray 的副本,或者 C# 是否知道如果仅读取此数据而不以任何方式编辑此数据,则不需要制作副本?

【问题讨论】:

  • 数组通过引用传递
  • @Matthew 不,数组不是通过引用传递的。数组类型引用,这些引用是按值传递的。在 C# 中,所有类型都按值传递,除非使用了 refout 关键字。
  • @Servy 你在技术上是正确的,最好的一种正确。

标签: c# function memory methods


【解决方案1】:

在 C# 中,数组实际上是对象,而不仅仅是 C 和 C++ 中的连续内存的可寻址区域。因此,在我们的例子中,只有数组的引用作为方法的参数传递。

【讨论】:

    【解决方案2】:

    C# 不会创建副本,因为数组将作为引用(如 C++ 指针)传递给方法。一般来说,只有struct 类型将作为副本传递,而普通的class 实例将作为引用传递。

    您可以在 MSDN 上阅读有关该主题的更多信息

    【讨论】:

      【解决方案3】:

      您可以在这里阅读:MSDN - Passing arrays as argument

      数组可以作为参数传递给方法参数。因为数组是引用类型,所以该方法可以改变元素的值。

      【讨论】:

        【解决方案4】:

        数组是,这就是为什么它们只是引用,当我们将数组传递给方法时,我们只需要传递一个地址(4 或 8 个字节) )。证明:

          Boolean isClass = typeof(int[][]).IsClass; // <- return true
        

        结构体传递,例如int 是一个结构

          Boolean isClass = typeof(int).IsClass; // <- return false;
        

        【讨论】:

          猜你喜欢
          • 2013-09-02
          • 2012-11-26
          • 1970-01-01
          • 1970-01-01
          • 2015-05-04
          • 1970-01-01
          • 2011-09-16
          • 1970-01-01
          • 2011-03-06
          相关资源
          最近更新 更多