c 中ref和out引數使用時需要注意的問題

2021-03-31 16:12:18 字數 1178 閱讀 8506

昨天寫了個關於

socket

接收udp

包的程式,呼叫了

socket.receivefrom

方法,發現了乙個

c#中關於

ref和

out引數傳遞時的問題,這裡提出來和大家共同**一下,首先宣告,下面的結論都是本人推測,還沒有得到任何定論,若有錯誤請大家指正。

首先,receivefrom

方法的原型為

public int receivefrom(byte, ref endpoint);

有乙個為

ref的

endpoint

引數,用它來返**到包的源位址資訊,

ref的語義是傳引用,即對所傳引用的修改可以反映到方法外面。我一般都使用

ipendpoint

來表示位址資訊,所以很自然的使用了如下的呼叫方法

(**1

)ipendpoint iep = new ipendpoint(ipaddress.any,0);

socket.receivefrom(buffer,ref(endpoint)iep);

這時編譯時出現了一下的錯誤,「

ref或

out引數必須是乙個

lvalue

」,iep

怎麼會不是乙個左值呢?關鍵是在呼叫方法時使用的強制轉換(例如

(endpoint)iep

),我改了一下**

(**2

)ipendpoint iep = new ipendpoint(ipaddress.any,0);

endpoint ep = (endpoint)iep;

socket.receivefrom(buffer,ref(endpoint)iep);

這次通過編譯了。為什麼在方法呼叫時會出問題?這裡要考慮型別強制轉換時的乙個細節,強制轉換時編譯器會先生成乙個臨時引用,然後再把這個臨時引用傳給乙個和轉換型別相同的引用,這個臨時引用比較特別——不是乙個左值(

lvalue

),不能被賦值!而使用

ref引數的方法一般都要對這個引用做修改,如果直接把這個臨時引用傳進去當時編譯器會抱怨

ref或

out引數必須是乙個

lvalue

。而**

2首先將這個臨時引用賦值到乙個常規引用上去,這時這個常規引用便是可以複製的了。

使用ref和out引數

ref型別引數側重修改,out型別引數側重輸出 ref在傳入值之前必須先初始化 out在函式內,函式結束之前,即傳出值之前初始化.eg protected void page load object sender,eventargs e int indexref 1 testref ref inde...

使用ref和out引數

通過ref和out關鍵字,可以以引用的方式傳遞任何型別的值。這樣做,將允許改變呼叫過程中使用的實參值。在研究ref和out的機制之前,首先有必要理解為什麼需要以引用方式來傳遞值型別。通常有兩個原因 使方法能改變其實參的值或者允許方法有多個返回值。ref引數修飾符使得c 可以建立按引用呼叫,而不是按值...

c 中ref和out引數使用時需要注意的問題

昨天寫了個關於 socket 接收udp 包的程式,呼叫了 socket.receivefrom 方法,發現了乙個 c 中關於 ref和 out引數傳遞時的問題,這裡提出來和大家共同 一下,首先宣告,下面的結論都是本人推測,還沒有得到任何定論,若有錯誤請大家指正。首先,receivefrom 方法的...