ref
通常我們向方法中傳遞的是值.方法獲得的是這些值的乙個拷貝,然後使用這些拷貝,當方法執行完畢後,這些拷貝將被丟棄,而原來的值不將受到影響.此外我們還有其他向方法傳遞引數的形式,引用(ref)和輸出(out).
有時,我們需要改變原來變數中的值,這時,我們可以向方法傳遞變數的引用,而不是變數的值.引用是乙個變數,他可以訪問原來變數的值,修改引用將修改原來變數的值.變數的值儲存在記憶體中,可以建立乙個引用,他指向變數在記憶體中的位置.當引用被修改時,修改的是記憶體中的值,因此變數的值可以將被修改.當我們呼叫乙個含有引用引數的方法時,方法中的引數將指向被傳遞給方法的相應變數,因此,我們會明白,為什麼當修改引數變數的修改也將導致原來變數的值.
建立引數按引用傳遞的方法,需使用關鍵字ref.例;
using system;
class gump
}
,b=",a,b);
b=doit.square(ref a);
console.writeline("after square->a=,b=",a,b);
}
}
通過測試,我們發現,a的值已經被修改為9了.
out
通過指定返回型別,可以從方法返回乙個值,有時候(也許還沒遇到,但是我們應該有這麼個方法),需要返回多個值,雖然我們可以使用ref來完成,但是c#專門提供了乙個屬性型別,關鍵字為out.介紹完後,我們將說明ref和out的區別.
using system;
class gump
}
",x1);
console.writeline("half1=",half1);
console.writeline("squared1=",squared1);
console.writeline("cubed1=",cubed1);
doit.math_rountines(x1,out half1,out squared1,out cubed1);
console.writeline("after method->x1=",x1);
console.writeline("half1=",half1);
console.writeline("squared1=",squared1);
console.writeline("cubed1=",cubed1);
}
}
通過使用out關鍵字,我們改變了三個變數的值,也就是說out是從方法中傳出值.
我們發現,ref和out似乎可以實現相同的功能.因為都可以改變傳遞到方法中的變數的值.但是,二者本質本質的區別就是,ref是傳入值,out是傳出值.在含有out關鍵字的方法中,變數必須由方法引數中不含out(可以是ref)的變數賦值或者由全域性(即方法可以使用的該方法外部變數)變數賦值,out的宗旨是保證每乙個傳出變數都必須被賦值.
上面**中被/**/注釋掉的部分,可以直接使用.也就是說,在呼叫方法前可以不初始化變數.但是"x1"是要賦值的,否則要報錯.而ref引數,在傳遞給方法時,就已經是還有值的了,所以ref側重修改.out側重輸出.
c 中ref與out區別
ref 和 out 都是c 中的關鍵字,所實現的功能也差不多,都是指定乙個引數按照引用傳遞。對於編譯後的程式而言,它們之間沒有任何區別,也就是說他們只有語法區別。有如下語法區別 1.ref 傳進去的引數必須在呼叫前初始化,out不必,即 int i somemethod ref i 語法錯誤 som...
C 中out與ref區別
一 ref 參考 與out區別 1 out 只出不進 將方法中的引數傳遞出去,在方法中將該引數傳遞出去之前需要在該方法起始賦初值 在方法外傳遞的該引數可以不用賦值 簡單理解就是 將乙個東西丟擲去之前必須對此東西進行修改,否則就不用丟擲去,修改時的動作必須發生在方法的起始。2 ref 有進有出 在方法...
C 方法中引數ref和out的解析
一 c 方法中引數型別 有4種引數型別,有時候很難記住它們的不同特徵,下圖對它們做乙個總結,使之更容易比較和對照。二 c 方法中的引數 1 值引數 使用值引數,通過複製實參的值到形參的方式把資料傳遞到方法。方法呼叫時,系統做如下操作 在棧中為形參分配空間 複製實參到形參 注 棧 先進後出 是編譯期間...