国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

c#中ref和out參數(shù)使用時需要注意的問題

2024-07-21 02:18:07
字體:
來源:轉載
供稿:網(wǎng)友
昨天寫了個關于socket接收udp包的程序,調用了socket.receivefrom方法,發(fā)現(xiàn)了一個c#中關于ref和out參數(shù)傳遞時的問題,這里提出來和大家共同探討一下,首先聲明,下面的結論都是本人推測,還沒有得到任何定論,若有錯誤請大家指正。

首先,receivefrom方法的原型為

public int receivefrom(byte[], ref endpoint);

有一個為ref的endpoint參數(shù),用它來返回收到包的源地址信息,ref的語義是傳引用,即對所傳引用的修改可以反映到方法外面。我一般都使用ipendpoint來表示地址信息,所以很自然的使用了如下的調用方法

(代碼1)

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

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

這時編譯時出現(xiàn)了一下的錯誤,“ref或out參數(shù)必須是一個lvalue”,iep怎么會不是一個左值呢?關鍵是在調用方法時使用的強制轉換(例如(endpoint)iep),我改了一下代碼

(代碼2)

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

endpoint ep = (endpoint)iep;

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

這次通過編譯了。為什么在方法調用時會出問題?這里要考慮類型強制轉換時的一個細節(jié),強制轉換時編譯器會先生成一個臨時引用,然后再把這個臨時引用傳給一個和轉換類型相同的引用,這個臨時引用比較特別——不是一個左值(lvalue),不能被賦值!而使用ref參數(shù)的方法一般都要對這個引用做修改,如果直接把這個臨時引用傳進去當時編譯器會抱怨ref或out參數(shù)必須是一個lvalue。而代碼2首先將這個臨時引用賦值到一個常規(guī)引用上去,這時這個常規(guī)引用便是可以復制的了。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 九江市| 姚安县| 孝感市| 南江县| 平利县| 喀喇| 梓潼县| 和政县| 安庆市| 电白县| 乌拉特中旗| 揭西县| 绿春县| 灌阳县| 赫章县| 华亭县| 略阳县| 沁阳市| 青铜峡市| 怀来县| 渑池县| 富民县| 集贤县| 浮山县| 陈巴尔虎旗| 贺州市| 西乡县| 游戏| 英吉沙县| 马公市| 尼木县| 太白县| 买车| 青川县| 科尔| 奉新县| 三江| 松滋市| 韩城市| 高清| 襄城县|