2014-10-08 38 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;