C 中使用ref 和 out 的區別

2021-09-21 14:36:34 字數 1666 閱讀 3226

ref

通常我們向方法中傳遞的是值,方法獲得的是這些值的乙個拷貝,然後使用這些拷貝,當方法執行完畢後,這些拷貝將被丟棄,而原來的值不會受到影響。 這種情況是通常的,當然還有另外一種情況,我們向方法傳遞引數的形式,引用(ref)和輸出(out)。

有時,我們需要改變原來變數中的值,這是我們可以向方法傳遞變數引用,而不是變數的值,引用是乙個變數,他可以訪問原來變數的值,修改引用將修改原來變數的值。變數的值儲存在記憶體中,可以建立乙個引用,他指向變數在記憶體中的位置,當引用被修改時,修改的是記憶體中的值,因此變數的值可以被修改,當我們呼叫乙個含有引用引數的方法時,方法中的引數將指向被傳遞給方法的相應變數,因此,我們會明白為什麼當修改引數變數的修改也將導致原來變數的值被修改。

建立引數按引用傳遞的方法,需使用關鍵字ref,例:

using system;

class gump

},b=",a,b);

b = doit.square(ref a);

console.writeline("after a=,b=", a, b);

console.readline();

}}

通過測試我們發現,變數a的值已經被修改為9 了。

out

通過制定返回型別,可以從方法返回乙個值,有時候,需要返回多個值,雖然我們可以使用ref來完成,但是c#專門提供了乙個屬性型別,關鍵字為out,介紹完後,我們將說明ref和out的區別。

using system;

class gump

}", x1);

console.writeline("before method->half1=",half1);

console.writeline("before method->squared1=",squared1);

console.writeline("before method->cubed1=",cubed1);

doit.math_routines(x1, out half1, out squared1, out cubed1);

console.writeline("after method->x1=", x1);

console.writeline("after method->half1=", half1);

console.writeline("after method->squared1=", squared1);

console.writeline("after method->cubed1=", cubed1);

console.readline();

}}

通過使用out關鍵字,我們改變了三個變數的值,也就是說out是從方法中傳出值

我們發現,ref和out似乎可以實現相同的功能,因為都可以改變傳遞到方法中的變數的值,但是二者本質的區別就是,ref是傳入值,out是傳出值,在含有out關鍵之的方法中,變數 必須有方法引數中不含out(可以是ref)的變數賦值或者由全域性(即方法可以使用的該方法外部變數)變數賦值,out的宗旨是保證每乙個傳出變數都必須被賦值

在傳入變數的時候,out關鍵字的變數可以不被初始化,但是沒有out 關鍵字的值要被賦值。而ref引數在傳遞給方法是,就已經被賦值了,所以ref側重修改,out側重輸出

C 中使用ref和out詳解

摘 要 傳值引數傳遞的是呼叫引數的乙份拷貝,而傳址引數傳遞的是呼叫引數的記憶體位址,該引數在方法內外指向的是同乙個儲存位置。首先,如果不使用這兩個關鍵字,那是什麼樣 呢?看下面的例子 using system class test static void swap int x,int y stati...

C 方法中使用ref和out引數

一 建立ref引數 在使用引數時,將引數傳遞給方法使用,而方法中對此值的任何改變並不能影響方法外部的變數。下面乙個例子,控制台輸出4,並沒有對變數進行增量。例如 class reforout public static void main string args i console.readline...

c 中out和ref的使用區別

c 中out和ref的使用區別 ref是傳遞引數的位址,out是返回值,兩者有一定的相同之處,不過也有不同點。使用ref前必須對變數賦值,out不用。out的函式會清空變數,即使變數已經賦值也不行,退出函式時所有out引用的變數都要賦值,ref引用的可以修改,也可以不修改。如果你想返回多個值怎麼辦,...