方法的C#内存处理

本文关键字:处理 内存 方法 | 更新日期: 2023-09-27 18:26:04

当某些对象用作输入参数时,我有一个关于C#函数或方法处理内存的方式的问题。我试着寻找这个问题的答案,但什么都找不到,不过我可能不知道该找什么。

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

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

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

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

方法的C#内存处理

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

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

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

正如您在这里所读到的:MSDN-将数组作为参数传递

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

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

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

结构传递,例如int的结构:

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