成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

C#中ref和out參數使用時需要注意的問題

2010-08-28 10:47:36來源:西部e網作者:

昨天寫了個關于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首先將這個臨時引用賦值到一個常規引用上去,這時這個常規引用便是可以復制的了。
關鍵詞:C#

贊助商鏈接:

主站蜘蛛池模板: 德昌县| 兰州市| 海城市| 清徐县| 新巴尔虎右旗| 思南县| 五大连池市| 福泉市| 唐山市| 土默特左旗| 泰宁县| 华池县| 微博| 岳阳县| 普陀区| 南澳县| 长阳| 石台县| 昂仁县| 浪卡子县| 阿瓦提县| 清苑县| 绍兴县| 博兴县| 苍南县| 邵武市| 北票市| 休宁县| 斗六市| 安顺市| 永福县| 北宁市| 甘洛县| 平陆县| 南投县| 高雄市| 济阳县| 桑日县| 通榆县| 洛隆县| 印江|