引用型別的變數不直接包含其資料;它包含的是對其資料的引用。
當通過值傳遞引用型別的引數時,有可能更改引用所指向的資料,如某類成員的值。
但是無法更改引用本身的值;也就是說,不能使用相同的引用為新類分配記憶體並使之在塊外保持。
若要這樣做,應使用 ref 或 out 關鍵字傳遞引數。
為了簡單起見,下面的示例使用 ref。
示例
下面的示例演示通過值向 change 方法傳遞引用型別的引數 arr。
由於該引數是對 arr 的引用,所以有可能更改陣列元素的值。
但是,嘗試將引數重新分配到不同的記憶體位置時,該操作僅在方法內有效,並不影響原始變數 arr。
class passingrefbyval
; // this change is local.
system.console.writeline("inside the method, the first element is: ", parray[0]);
}static void main()
;system.console.writeline("inside main, before calling the method, the first element is: ", arr [0]);
change(arr);
system.console.writeline("inside main, after calling the method, the first element is: ", arr [0]);}}
/* output:
inside main, before calling the method, the first element is: 1
inside the method, the first element is: -3
inside main, after calling the method, the first element is: 888
*/在上個示例中,陣列 arr 為引用型別,在未使用 ref
引數的情況下傳遞給方法。
在此情況下,將向方法傳遞指向 arr 的引用的乙個副本。
輸出顯示方法有可能更改陣列元素的內容,在這種情況下,從 1 改為 888。
但是,在 change 方法內使用 new
運算子來分配新的記憶體部分,將使變數 parray 引用新的陣列。
因此,這之後的任何更改都不會影響原始陣列 arr(它是在 main 內建立的)。
實際上,本示例中建立了兩個陣列,乙個在 main 內,乙個在 change 方法內。
本示例除在方法頭和呼叫中使用 ref 關鍵字以外,其餘與上個示例相同。
方法內發生的任何更改都會影響呼叫程式中的原始變數。
class passingrefbyref ; system.console.writeline("inside the method, the first element is: ", parray[0]); } static void main() ; system.console.writeline("inside main, before calling the method, the first element is: ", arr[0]); change(ref arr); system.console.writeline("inside main, after calling the method, the first element is: ", arr[0]); }}/* output: inside main, before calling the method, the first element is: 1 inside the method, the first element is: -3 inside main, after calling the method, the first element is: -3*/方法內發生的所有更改都影響 main 中的原始陣列。交換字串是通過引用傳遞引用型別引數的很好的示例。實際上,使用 new 運算子對原始陣列進行了重新分配。
因此,呼叫 change 方法後,對 arr 的任何引用都將指向 change 方法中建立的五個元素的陣列。
本示例中,str1 和 str2 兩個字串在 main 中初始化,並作為由 ref 關鍵字修改的引數傳遞給 swapstrings 方法。
這兩個字串在該方法內以及 main 內均進行交換。
如果同時從方法頭和方法呼叫中移除 ref 關鍵字,則呼叫程式中不會發生任何更改。
C 中值型別和引用型別引數傳遞
原則 盡可能控制對資料的修改,如果可以 某個資料不會或不應該被改變,就要對其控制,而不要期望使用這個資料的呼叫者不會改變其值。如果引數在使用過程中被意外修改,將會帶來不可預知的結果,而且這種錯誤很難被檢查到,所以我們在設計方法引數的時候,要充分考慮傳遞引用型別引數或者引用方式傳遞引用型別引數可能帶來...
值傳遞與引用傳遞 引數型別
根據儲存方式不同,我們將資料型別分為值型別和引用型別。值型別 基本資料型別 int float double boolean long 列舉 結構。儲存在棧當中的,提取資料快,但是分配空間多,耗資源,建議資料量少的情況下使用。引用型別 object型別 類 陣列 介面 值傳遞 1 直接傳遞值型別 結...
C 程式設計中將引用型別作為函式引數的方法指南
有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能。到目前為止我們介紹過函式引數傳遞的兩種情況。1 將變數名作為實參和形參 這時傳給形參程式設計客棧的是變數的值,傳遞是單向的。如果在執行函式期間形參的值發生變化,並不傳回給實參。因為在呼叫函式...