c 中通過值和引用傳遞引數 downmoon

2021-06-02 14:59:16 字數 4847 閱讀 7360

在 c# 中,既可以通過值也可以通過引用傳遞引數。通過引用傳遞引數允許函式成員(方法、屬性、索引器、運算子和建構函式)更改引數的值,並保持該更改。若要通過引用傳遞引數,請使用refout關鍵字。為簡單起見,本主題的示例中只使用了 ref 關鍵字。有關refout之間的差異的資訊,請參見、使用 ref 和 out 傳遞陣列。

本主題包括下列章節:

它還包括以下示例:

示例演示

是否使用 ref 或 out

1通過值傳遞值型別否2

通過引用傳遞值型別是3

交換值型別(兩個整數)是4

通過值傳遞引用型別否5

通過引用傳遞引用型別是6

交換引用型別(兩個字串)是

值型別變數直接包含其資料,這與引用型別變數不同,後者包含對其資料的引用。因此,向方法傳遞值型別變數意味著向方法傳遞變數的乙個副本。方法內發生的對引數的更改對該變數中儲存的原始資料無任何影響。如果希望所呼叫的方法更改引數值,必須使用refout關鍵字通過引用傳遞該引數。為了簡單起見,以下示例使用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方法,在該方法中傳遞xy兩個變數,然後使方法交換它們的內容。必須通過引用向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:交換兩個字串

交換字串是通過引用傳遞引用型別引數的很好的示例。本示例中,str1str2兩個字串在 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語言中實參和形參之間的資料傳遞是單向的值傳遞。被呼叫函式的形參只有函式被呼叫時才會臨時分配儲存單元,一旦呼叫結束占用的記...