昨天寫了個關於
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 方法的...