在 c# 中,既可以通過值也可以通過引用傳遞引數。通過引用傳遞引數允許函式成員(方法、屬性、索引器、運算子和建構函式)更改引數的值,並保持該更改。若要通過引用傳遞引數,請使用ref或out關鍵字。為簡單起見,本主題的示例中只使用了 ref 關鍵字。有關ref和out之間的差異的資訊,請參見、使用 ref 和 out 傳遞陣列。
本主題包括下列章節:
它還包括以下示例:
示例演示
是否使用 ref 或 out
1通過值傳遞值型別否2
通過引用傳遞值型別是3
交換值型別(兩個整數)是4
通過值傳遞引用型別否5
通過引用傳遞引用型別是6
交換引用型別(兩個字串)是
值型別變數直接包含其資料,這與引用型別變數不同,後者包含對其資料的引用。因此,向方法傳遞值型別變數意味著向方法傳遞變數的乙個副本。方法內發生的對引數的更改對該變數中儲存的原始資料無任何影響。如果希望所呼叫的方法更改引數值,必須使用ref或out關鍵字通過引用傳遞該引數。為了簡單起見,以下示例使用ref。
示例 1:通過值傳遞值型別
下面的示例演示通過值傳遞值型別引數。通過值將變數myint
傳遞給方法squareit
。方法內發生的任何更改對變數的原始值無任何影響。
// passingparams1.cs輸出using system;
class passingvalbyval
public static void main()
}
the value before calling the method: 5**討論the value inside the method: 25
the value after calling the method: 5
變數myint
為值型別,包含其資料(值5
)。當呼叫squareit
時,myint
的內容被複製到引數x
中,在方法內將該引數求平方。但在 main 中,myint
的值在呼叫squareit
方法之前和之後是相同的。實際上,方法內發生的更改只影響區域性變數x
。
示例 2:通過引用傳遞值型別
下面的示例除使用ref關鍵字傳遞引數以外,其餘與「示例 1」相同。引數的值在呼叫方法後發生更改。
// passingparams2.cs輸出using system;
class passingvalbyref
public static void main()
}
the value before calling the method: 5**討論the value inside the method: 25
the value after calling the method: 25
本示例中,傳遞的不是myint
的值,而是對myint
的引用。引數x
不是int型別,它是對int的引用(本例中為對myint
的引用)。因此,當在方法內對x
求平方時,實際被求平方的是x
所引用的項:myint
。
示例 3:交換值型別
更改所傳遞引數的值的常見示例是swap
方法,在該方法中傳遞x
和y
兩個變數,然後使方法交換它們的內容。必須通過引用向swap
方法傳遞引數;否則,方法內所處理的將是引數的本地副本。以下是使用引用引數的swap
方法的示例:
static void swapbyref(ref int x, ref int y)呼叫該方法時,請在呼叫中使用ref關鍵字,如下所示:
swapbyref (ref i, ref j);引用型別的變數不直接包含其資料;它包含的是對其資料的引用。當通過值傳遞引用型別的引數時,有可能更改引用所指向的資料,如某類成員的值。但是無法更改引用本身的值;也就是說,不能使用相同的引用為新類分配記憶體並使之在塊外保持。若要這樣做,請使用ref(或out)關鍵字傳遞引數。為了簡單起見,以下示例使用ref。
示例 4:通過值傳遞引用型別
下面的示例演示通過值向change
方法傳遞引用型別的引數myarray
。由於該引數是對myarray
的引用,所以有可能更改陣列元素的值。但是,試圖將引數重新分配到不同的記憶體位置時,該操作僅在方法內有效,並不影響原始變數myarray
。
// passingparams4.cs輸出// passing an array to a method without the ref keyword.
// compare the results to those of example 5.
using system;
class passingrefbyval
; // this change is local.
console.writeline("inside the method, the first element is: ", arr[0]);
}public static void main()
}
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
在上個示例中,陣列myarray
為引用型別,在未使用ref引數的情況下傳遞給方法。在此情況下,將向方法傳遞指向myarray
的引用的乙個副本。輸出顯示方法有可能更改陣列元素的內容(從1
改為888
)。但是,在change
方法內使用new運算子分配新的記憶體部分,將使變數arr
引用新的陣列。因此,這之後的任何更改都不會影響原始陣列myarray
(它是在main
內建立的)。實際上,本示例中建立了兩個陣列,乙個在main
內,乙個在change
方法內。
示例 5:通過引用傳遞引用型別
本示例除在方法頭和呼叫中使用ref關鍵字以外,其餘與「示例 4」相同。方法內發生的任何更改都會影響呼叫程式中的原始變數。
// passingparams5.cs輸出// passing an array to a method with the ref keyword.
// compare the results to those of example 4.
using system;
class passingrefbyref
; console.writeline("inside the method, the first element is: ", arr[0]);
}public static void main()
}
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
方法後,對myarray
的任何引用都將指向change
方法中建立的五個元素的陣列。
示例 6:交換兩個字串
交換字串是通過引用傳遞引用型別引數的很好的示例。本示例中,str1
和str2
兩個字串在 main 中初始化,並作為由ref關鍵字修飾的引數傳遞給swapstrings
方法。這兩個字串在該方法內以及 main 內均進行交換。
// passingparams6.cs輸出using system;
public static void main()
}
inside the method: smith, john
**討論
本示例中,需要通過引用傳遞引數以影響呼叫程式中的變數。如果同時從方法頭和方法呼叫中移除ref關鍵字,則呼叫程式中不會發生任何更改。
C 執行緒的引數傳遞 值傳遞和引用
前言 執行緒一般通過複製或引用獲取其資料。預設情況下,您應該用乙個副本。為啥呢?如果您的執行緒通過引用獲取其資料,那得非常小心引數的生命週期。執行緒引數 執行緒是可變引數模板。所以它可以獲得任意數量的引數。現在咱們來看看通過複製或引用獲取引數之間的區別 std string s std thread...
C 中的值傳遞和引用傳遞
c 抽象程式設計 函式與庫 c 中的值傳遞和引用傳遞 c 抽象程式設計 介面 1 h檔案與.cpp檔案的建立 c 抽象程式設計 介面 2 介面的用途 c 抽象程式設計 介面 3 介面設計的重點 c 抽象程式設計 介面 4 隨機介面的設計 c 抽象程式設計 介面 5 隨機數演算法 c 抽象程式設計 介...
C 值傳遞和引用傳遞
概念 在定義函式時函式括號中的變數名成為形式引數,簡稱形參或虛擬引數 在主調函式中呼叫乙個函式時,該函式括號中的引數名稱為實際引數,簡稱實參,實參可以是常量 變數或表示式。注意 c語言中實參和形參之間的資料傳遞是單向的值傳遞。被呼叫函式的形參只有函式被呼叫時才會臨時分配儲存單元,一旦呼叫結束占用的記...