之前每次遇到ref和out时,老是忘记他们的使用方法和区别。每次都要网上搜一下别人写的博客来回忆。这次干脆自己整合一下别人博客的内容,方便下次忘记时查询。

用途:

在C#中通过使用方法来获取返回值时,通常只能得到一个返回值。因此,当一个方法需要返回多个值的时候,就需要用到ref和out。

概述:

ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。

out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。

同:

1、都能返回多个返回值。

2、若要使用 ref 和out参数,则方法定义和调用方法都必须显式使用 ref和out 关键字。在方法中对参数的设置和改变将会直接影响函数调用之处(参数的初始值)。

异:

1、ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;

2、out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。

口诀:

ref有进有出,out只出不进。

正确的使用ref:

class Program
{
static void Main(string[] args)
{
Program pg = new Program();
int x = 10;
int y = 20;
pg.GetValue(ref x, ref y);
Console.WriteLine("x={0},y={1}", x, y); Console.ReadLine();
} public void GetValue(ref int x, ref int y)
{
x = 521;
y = 520;
}
}

运行结果为

x=521,y=520

错误的使用ref:

class Program
{
static void Main(string[] args)
{
Program pg = new Program();
int x;
int y; //此处x,y没有进行初始化,则编译不通过。
pg.GetValue(ref x, ref y);
Console.WriteLine("x={0},y={1}", x, y); Console.ReadLine();
} public void GetValue(ref int x, ref int y)
{
x = 1000;
y = 1;
}
}

  

正确的使用out:

class Program
{
static void Main(string[] args)
{
Program pg = new Program();
int x=10;
int y=233;
pg.Swap(out x, out y);
Console.WriteLine("x={0},y={1}", x, y); Console.ReadLine();
} public void Swap(out int a,out int b)
{
int temp = a; //a,b在函数内部没有赋初值,则出现错误。
a = 521;
b = 520;
}
}

  

运行结果为

x=521,y=520

错误的使用out:

class Program
{
static void Main(string[] args)
{
Program pg = new Program();
int x=10;
int y=233;
pg.Swap(out x, out y);
Console.WriteLine("x={0},y={1}", x, y); Console.ReadLine();
} public void Swap(out int a,out int b)
{
int temp = a; //a,b在函数内部没有赋初值,则出现错误。
a = b;
b = temp;
}
}

  

原文连接

https://www.cnblogs.com/wolf-sun/p/3371174.html

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

最新文章

  1. ASP.NET 5 已死 - 隆重介绍 ASP.NET Core 1.0 和 .NET Core 1.0
  2. Linux 下多用户申请git公钥方法
  3. JAVA Socket超时浅析
  4. ORA-00245: control file backup failed; target is likely on a local file system
  5. c/c++:动态库 静态库 linux/windows 例子 (转)
  6. [原创]java WEB学习笔记54:Struts2学习之路---概述,环境的搭建
  7. SQL Server 2008 没有可用于 charge_sys_Log.LDF 的编辑器
  8. UVaLive 6625 Diagrams & Tableaux (状压DP 或者 DFS暴力)
  9. Java解析XMl文件之SAX和DOm方法
  10. Hibernate中的一对一关系详解(1)
  11. AD怎样画 board shape
  12. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 分类: dp 2015-05-21 10:50 14人阅读 评论(0) 收藏
  13. Java学习之ThreadLocal
  14. ubutun 下webalizer 分析Apache日志
  15. Android Studio怎样选择查看指定进程的log?
  16. Java学习日记——基本数据类型
  17. 将Python程序打包为exe方法
  18. 关于HTMl CSS
  19. Windows和Frames之间的切换
  20. 从头调试stm32 HID

热门文章

  1. TEMPO研究第一年影像学数据: 骨侵蚀修复几乎只出现在无关节肿胀或肿胀改善组
  2. 认识 C 的编译器和编译流程
  3. Java对象布局
  4. C语言多维数组的实现与操作
  5. ThreadLocal及常用场景
  6. Markdown格式文档图片设置居右
  7. 重置Beyond Compare 4试用时间
  8. Bug Bash测试
  9. Centos7.6centOS7.8多网卡多IP配置
  10. maven上传jar包或pom文件到远程仓库