2014-10-08 45 views
2

我有一个关于他们的方式的问题C#函数或方法,当某些对象用作输入参数时处理内存。我试图寻找答案,但一直没能找到任何东西,但我可能不知道要寻找什么。方法的C#内存处理

问题:假设我有一个非常大的整数数组,大小为10.000 10.000,称为'MyArray'。比方说,我还有一种叫做'MyMethod'的方法,它从MyArray的两个指定行(这是输入)接收几个条目并对它执行一些操作,比如添加或乘以这些数字,然后返回另一个整数。

为了让我的代码尽可能的短,我宁愿做一个方法

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

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

+5

数组由参考 – Matthew 2014-10-08 13:43:18

+3

@Matthew否,阵列不通过引用传递通过。数组类型*是*引用,并且这些引用是按值传递的。除非使用'ref'或'out'关键字,否则所有类型都将通过C#中的值传递。 – Servy 2014-10-08 13:55:04

+1

@Servy你在技术上是正确的,最好的一种正确。 – Matthew 2014-10-08 14:00:50

回答

0

C#不会创建副本,因为数组将作为引用(如C++指针)传递给该方法。通常只有struct类型将作为副本传递,并且正常的class实例将作为参考传递。

你可以阅读更多的话题上MSDN

0

正如你可以在这里阅读:MSDN - Passing arrays as argument

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

2

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

0

数组是,这就是为什么他们只是引用,当我们通过数组的方法我们需要的是通过一个地址(4或8个字节)。证明:

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

的Structs,例如通过int结构

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