ref和out的區別在c# 中,既可以通過值也可以通過引用傳遞引數。通過引用傳遞引數允許函式成員更改引數的值,並保持該更改。若要通過引用傳遞引數, 可使用ref或out關鍵字。ref和out這兩個關鍵字都能夠提供相似的功效,其作用也很像c中的指標變數。它們的區別是:
1、使用ref型引數時,傳入的引數必須先被初始化。對out而言,必須在方法中對其完成初始化。
2、使用ref和out時,在方法的引數和執行方法時,都要加ref或out關鍵字。以滿足匹配。
3、out適合用在需要retrun多個返回值的地方,而ref則用在需要被呼叫的方法修改呼叫者的引用的時候。
注:在c#中,方法的引數傳遞有四種型別:傳值(by value),傳址(by reference),輸出引數(by output),陣列引數(by array)。傳值引數無需額外的修飾符,傳址引數需要修飾符ref,輸出引數需要修飾符out,陣列引數需要修飾符params。傳值引數在方法呼叫過程中如果改變了引數的值,那麼傳入方法的引數在方法呼叫完成以後並不因此而改變,而是保留原來傳入時的值。傳址引數恰恰相反,如果方法呼叫過程改變了引數的值,那麼傳入方法的引數在呼叫完成以後也隨之改變。實際上從名稱上我們可以清楚地看出兩者的含義--傳值引數傳遞的是呼叫引數的乙份拷貝,而傳址引數傳遞的是呼叫引數的記憶體位址,該引數在方法內外指向的是同乙個儲存位置。
方法引數上的 ref 方法引數關鍵字使方法引用傳遞到方法的同乙個變數。當控制傳遞**用方法時,在方法中對引數所做的任何更改都將反映在該變數中。
若要使用 ref 引數,必須將引數作為 ref 參數顯式傳遞到方法。ref 引數的值被傳遞到 ref 引數。
傳遞到 ref 引數的引數必須最先初始化。將此方法與 out 引數相比,後者的引數在傳遞到 out 引數之前不必顯式初始化。
屬性不是變數,不能作為 ref 引數傳遞。
如果兩種方法的宣告僅在它們對 ref 的使用方面不同,則將出現過載。但是,無法定義僅在 ref 和 out 方面不同的過載。
out方法引數上的 out 方法引數關鍵字使方法引用傳遞到方法的同乙個變數。當控制傳遞**用方法時,在方法中對引數所做的任何更改都將反映在該變數中。
當希望方法返回多個值時,宣告 out 方法非常有用。使用 out 引數的方法仍然可以返回乙個值。乙個方法可以有乙個以上的 out 引數。
若要使用 out 引數,必須將引數作為 out 參數顯式傳遞到方法。out 引數的值不會傳遞到 out 引數。
不必初始化作為 out 引數傳遞的變數。然而,必須在方法返回之前為 out 引數賦值。
屬性不是變數,不能作為 out 引數傳遞。
網上有很多文章說ref 只傳值,out傳位址等等這種說法,好像不是非常的準確。以下是我做的例項**,大家可以去試試:
public int refvalue(int i,ref int j)
public int outvalue(int i, out int j)
private void cmdref_click(object sender, eventargs e)
private void cmdout_click(object sender, eventargs e)
借網上總結的一句話說,ref是有進有出,而out是只出不進。
ref
通常我們向方法中傳遞的是值.方法獲得的是這些值的乙個拷貝,然後使用這些拷貝,當方法執行完畢後,這些拷貝將被丟棄,而原來的值不將受到影響.此外我們還有其他向方法傳遞引數的形式,引用(ref)和輸出(out).
有時,我們需要改變原來變數中的值,這時,我們可以向方法傳遞變數的引用,而不是變數的值.引用是乙個變數,他可以訪問原來變數的值,修改引用將修改原來變數的值.變數的值儲存在記憶體中,可以建立乙個引用,他指向變數在記憶體中的位置.當引用被修改時,修改的是記憶體中的值,因此變數的值可以將被修改.當我們呼叫乙個含有引用引數的方法時,方法中的引數將指向被傳遞給方法的相應變數,因此,我們會明白,為什麼當修改引數變數的修改也將導致原來變數的值.
建立引數按引用傳遞的方法,需使用關鍵字ref.例;
using
system;
class
gump
}class
public
static
void
main()
,b=\",a,b);b=
doit.square(
refa);
console.writeline(\
"after square->a=,b=\",a,b);}}
通過測試,我們發現,a的值已經被修改為9了.
out
通過指定返回型別,可以從方法返回乙個值,有時候(也許還沒遇到,但是我們應該有這麼個方法),需要返回多個值,雖然我們可以使用ref來完成,但是c#專門提供了乙個屬性型別,關鍵字為out.介紹完後,我們將說明ref和out的區別.
通過使用out關鍵字,我們改變了三個變數的值,也就是說out是從方法中傳出值.
using
system;
class
gump
}class
public
static
void
main()
\",x1);
console.writeline(\
"half1=\",half1); console.writeline(\"squared1=\",squared1);
console.writeline(\
"cubed1=\",cubed1);
doit.math_rountines(x1,
outhalf1,
outsquared1,
outcubed1);
console.writeline(\
"after method->x1=\",x1);
console.writeline(\
"half1=\",half1);
console.writeline(\
"squared1=\",squared1);
console.writeline(\
"cubed1=\",cubed1);}}
我們發現,ref和out似乎可以實現相同的功能.因為都可以改變傳遞到方法中的變數的值.但是,二者本質本質的區別就是,ref是傳入值,out是傳出值.在含有out關鍵字的方法中,變數必須由方法引數中不含out(可以是ref)的變數賦值或者由全域性(即方法可以使用的該方法外部變數)變數賦值,out的宗旨是保證每乙個傳出變數都必須被賦值.
上面**中被/**/注釋掉的部分,可以直接使用.也就是說,在呼叫方法前可以不初始化變數.但是\"x1\"是要賦值的,否則要報錯.而ref引數,在傳遞給方法時,就已經是還有值的了,所以ref側重修改.out側重輸出.
C 基礎 ref 和 out 區別
ref和out的區別在c 中,既可以通過值也可以通過引用傳遞引數。通過引用傳遞引數允許函式成員更改引數的值,並保持該更改。若要通過引用傳遞引數,可使用ref或out關鍵字。ref和out這兩個關鍵字都能夠提供相似的功效,其作用也很像c中的指標變數。它們的區別是 1 使用ref型引數時,傳入的引數必須...
C 基礎 out和ref的區別
public partial class 知識點 system.web.ui.page 呼叫方法之前,傳遞引數的時候,引數可以先不初始化 方法返回前,必須給out引數賦值,因為out引數值是不能通過實參傳遞到方法中的 private int outfun out object a 必須在呼叫前,給r...
C 基礎 ref和out的區別
ref和out的區別在c 中,既可以通過值也可以通過引用傳遞引數。通過引用傳遞引數允許函式成員更改引數的值,並保持該更改。若要通過引用傳遞引數,可使用ref或out關鍵字。ref和out這兩個關鍵字都能夠提供相似的功效,其作用也很像c中的指標變數。它們的區別是 1 使用ref型引數時,傳入的引數必須...