C 中方法引數的傳遞

2021-06-18 02:42:56 字數 1200 閱讀 4094

我們知道,使用引數傳遞給方法有兩種傳遞方式,一種是引用傳遞,另一種則是值傳遞。

變數在通過引用方式傳遞給方法時,傳遞給方法的就是這個變數,因此在被呼叫的方法內部對該變數內容進行修改,方法退出後修改的變數值依然有效。而變數通過值傳遞給方法時,傳遞的就是該變數的乙個副本,在方法內部對其修改當方法退出後該變數的原值並沒有被修改。

如果變數是複雜的資料型別,用值傳遞的方式則會使效率降低,原因在於會複製大量的資料副本。

在c#中,沒有特殊申明時,所有的引數傳遞方式都是值傳遞方式。那麼明明有些引數傳遞給方法後變數的值是會被修改的,例如類、陣列作為引數傳遞時。為什麼說是值傳遞呢?

這裡在理解上需要注意下,在傳遞的時候我們傳遞的是類的例項名稱或陣列名稱,變數本身就是引用型別,所以傳遞的是類或陣列的引用,把這個引用當做乙個值傳遞給方法,在被呼叫的方法中複製的正是引用的副本,所以在方法內部雖然操作的是引用的副本,其實操作的是同乙個物件,修改的新的值會反射在原始物件中。

宣告引用傳遞:

宣告引用傳遞的關鍵字:ref 、out

如前面所講的,引數通過值傳遞是預設,有時候也需要強制使用引用傳遞。這時候就需要使用ref關鍵字修飾變數。如果把乙個變數傳遞給方法,並且該變數前帶有ref關鍵字,就說明,被呼叫的方法中對該變數的值做修改會影響到變數的原值。有一點需要注意,該變數在傳遞之前是需要初始化的。      

static void function(int ints, ref int value)

在呼叫該方法時候也需要加ref         

function(ints,ref i);
有時候我們需要在c#中也能像c,c++的方法一樣,函式能夠在一次呼叫中輸出多個值,這就需要使用輸出引數,只要把輸出的值賦予通過引用傳遞給方法的變數即可。

可是c#規定,引數在傳遞給方法之前必須要初始化先,哪怕傳遞之前的初始化是無意義的,但這樣做沒有必要,有時候可能會使得可讀性變差甚至引起混亂。編譯器使用out關鍵字來初始化引數變數,在傳遞給方法的輸入引數前面加上out關鍵字,方法在呼叫之前可以不需要初始化。在方法內部修改引數變數的值,會被儲存下來。在呼叫該方法時候也需要加out關鍵字。

static void function(out int value)

int i;

function(out i);

Java中方法的引數傳遞機制

public class foo public static void operator stringbuffer x,stringbuffer y 最近看到這道題,網上好多錯誤解答,為防止初學者被誤導,特發文與大家 先說結果 ab,b 關鍵點在於 執行至operator方法時,是將實參a,b的值複...

JAVA中方法引數的引用傳遞

當乙個物件被當作引數傳遞到乙個方法 這就是所謂的按引用傳遞。public class user public void setname string name public class test public static void main string args 上面 的輸出結果是 hello ...

java中方法的引數傳遞的是什麼?

public class test1 private void change string str 列印結果 hello hello 要理解上面的問題,首先要理解物件和引用的關係。test1中,string s new string hello 在堆記憶體中儲存了物件的值 hello 而在棧記憶體中...