博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#:ref和out的联系及区别。
阅读量:5912 次
发布时间:2019-06-19

本文共 2861 字,大约阅读时间需要 9 分钟。

之前学习C#时候就遇到了这个问题,不过当时没有深究。昨晚想到这个问题时候自己尝试敲了敲代码,结果从运行的结果来看,越看越乱。在查看了一些资料的基础上,自己总结了一下。
可能会有点乱,但是自己总结出来的东西。
 
一:ref 关键字使参数按引用传递。
其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
也即是说,在方法中对参数的设置和改变将会直接影响函数调用之处(代码①及②)。无论是函数的定义还是调用时均不可忽略关键字ref.
可以对比代码:
代码①:
1 class Program 2     { 3         static void Main(string[] args) 4         { 5             Program pg = new Program(); 6             int x = 10; 7             int y = 20; 8             pg.GetValue(ref x, ref  y); 9             Console.WriteLine("x={0},y={1}", x, y);10 11             Console.ReadLine();12           13         }14 15         public void GetValue(ref int x, ref int y)16         {17             x = 521;18             y = 520;19         }20     }

 

运行结果为

代码②

1 class Program 2     { 3         static void Main(string[] args) 4         { 5             Program pg = new Program(); 6             int x = 10; 7             int y = 20; 8             pg.GetValue(ref x, ref  y); 9             Console.WriteLine("x={0},y={1}", x, y);10 11             Console.ReadLine();12           13         }14 15         public void GetValue(ref int x, ref int y)16         {17             x = 1000;18             y = 1;19         }20     }

 

由代码① 和②的运行结果可以看出,在方法中对参数所做的任何更改都将反映在该变量中,而在main函数中对参数的赋值却没有起到作用,这是不是说明不需要进行初始化呢?来看第二点

二:ref定义的参数在使用前必须初始化,无论在函数定义时候参数有没有赋予初值。这条正好区分out指定的参数可以不在调用函数的时候进行初始化。
来看代码③ 以及其运行结果:
1  class Program 2     { 3         static void Main(string[] args) 4         { 5             Program pg = new Program(); 6             int x; 7             int y;        //此处x,y没有进行初始化,则编译不通过。 8             pg.GetValue(ref x, ref  y); 9             Console.WriteLine("x={0},y={1}", x, y);10 11             Console.ReadLine();12           13         }14 15         public void GetValue(ref int x, ref int y)16         {17             x = 1000;18             y = 1;19         }    20     }

 

出现的错误为:使用了未赋值的局部变量“x”,“y”。故可以说明ref指定的参数无论在函数定义的时候有没有赋予初值,在使用的时候必须初始化。

三 :对out来说,第一条同样适用。将代码①以及②中的ref全部修改成out,则可与使用ref得到同样的结果。
 
四:out指定的参数必须在函数定义的时候就赋初值。否则则出现错误。对比ref指定的参数则可以不在函数内部进行赋初值,在函数调用时候再赋初值也可以。
代码④:
1 class Program 2     { 3         static void Main(string[] args) 4         { 5             Program pg = new Program(); 6             int x=10; 7             int y=233; 8             pg.Swap(out x, out y); 9             Console.WriteLine("x={0},y={1}", x, y);10 11             Console.ReadLine();12           13         }14 15         public void Swap(out int a,out  int b)16         {17             18             int temp = a;   //a,b在函数内部没有赋初值,则出现错误。19             a = b;20             b = temp;21         }     22     23     }

 

出现错误:使用了未赋值的out参数“a”,"b"
则在swap函数定义时候给a,b赋上初值则运行正确。
 
总结以上四条得到ref和out使用时的区别是:
①:ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;
②:out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。

转载于:https://www.cnblogs.com/yanhan/archive/2013/01/26/2877889.html

你可能感兴趣的文章
来自田野的回音——《背过身去的大娘娘》的读后感范文2600字
查看>>
LNMP架构 (Ⅱ)——nginx相关配置、nginx代理
查看>>
神级python程序员只需要一个公众号,再也不会错过重要资讯
查看>>
双十一流量洪峰 支撑阿里核心业务的云数据库揭秘
查看>>
OSChina 周一乱弹 ——程序员跟产品经理撕逼必须掌握的套路
查看>>
Linux系统启动流程详解
查看>>
我的友情链接
查看>>
Magento(CE1.X)自带模块解析五
查看>>
linux基础
查看>>
Factory Method模式 (一)
查看>>
java正则表达式的学习
查看>>
Linux 环境变量的配置解决(-bash: jps: command not found)问题
查看>>
redis遇到过的问题汇总(持续更新)
查看>>
组策略无法正常应用
查看>>
[转载]Monit:开源服务器监控工具
查看>>
Linux 打印 颜色显示
查看>>
dubbo请求调用过程分析
查看>>
Oracle学习(一):Oracle数据库基础
查看>>
27. Python对Mysql的操作(2)
查看>>
Linux 中用 strace 追踪系统调用和信号值
查看>>