c#中ref和out参数使用时需要注意的问题

2016-01-29 13:08 64 1 收藏

c#中ref和out参数使用时需要注意的问题,c#中ref和out参数使用时需要注意的问题

【 tulaoshi.com - ASP.NET 】

昨天写了个关于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首先将这个临时引用赋值到一个常规引用上去,这时这个常规引用便是可以复制的了。

来源:http://www.tulaoshi.com/n/20160129/1489051.html

延伸阅读
标签: 粉饼 粉底 美妆
1、粉饼按不同的功能,分为保湿,防晒,和控油的三大种类。挑选的时候需要考 虑到自身的皮肤条件和需求来选择。皮肤较干的人,建议使用含有保湿成分的粉饼。皮肤比较油的人,建议使用后含有控油成分的粉饼。在夏季呢,则推荐使用含有防晒成分的粉饼,可以很好的保护肌肤,不收紫外线的伤害。 2、按照质地,粉饼分为珠光质地粉...
C#中数组是引用类型,C#定义整型数组方式是:int [] intArray = {1,2,3};或int [] intArray = new int;而C++中定义整型数组的方式是:int intArray[] = {1,2,3};或int * intArray = new int;C#中的数组可以是一维的也可以是多维的,同样也支持矩阵和参差不齐的数组。注意:定义多维数组(矩阵)的方式是[,,]而定义多维“参差矩阵”的方式是[]...
标签: 冰箱 家用电器
一、速冻可以保鲜 0℃—3℃是食物细胞内水分冻结成最大冰晶的温度带,食物从0℃降到—3℃时间越短,食物的保鲜效果越好。速冻可以使食物以最快的速度完成这一冻结过程。在食物被速冻过程中,将形成最细小的冰晶,这种细小的冰晶不会剌破食物的细胞膜,这样,在化冻时细胞组织液得到完整保存,减少营养流失,食物达到了保鲜目的。 ...
可能大家都知道dataview这个名词的概念,但也许不是很多人可以说清楚在.net架构中它的应用范围和程度。比如:究竟datagrid和repeater这些控件是如何和数据关联起来的?很多人会告诉我是通过dataset。这显然是正确的,但究竟最根本最直接的是通过什么联系起来的呢? 答案就是dataview。其实下面的语句: DatagridTC.DataSource ...
写过论坛的朋友,特别是把路径放到数据里,然后在服务器端读取数据库里的字段,把路径信息动态的显示在客户端.     如过直接以 http://xxxx.xxxx.net/ShowForum.aspx?id=2&rootID=0&userName=myUserName     就会发现,直接把参数信息显示在Client端了.别有用心的人,可能会对你的服务器进行攻击  &nbs...

经验教程

594

收藏

39
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部