了解C#中ref和out关键字的不同
在学习C#过程中,遇到了ref和out关键字。他们两的用法很像但是又有所不同,在深入了解后结合自己的看法,做个笔记总结一下。小白第一次写博文,如有什么错误的地方欢迎指正
认识ref和out
要发现两个关键字之间的不同,那我们就要先单独认识这两个关键字。
ref关键字
ref 关键字指示参数进行引用传递。使用引用传递的效果是,在所调用方法中对参数进行的修改都会反应在调用方法中。如果要使用 ref 参数,方法定义和调用方法均必须显式使用 ref 关键字。
out关键字
out 关键字通过引用传递参数,这和ref 关键字类似。不过在使用ref 关键字的时候必须在传递之前对变量进行初始化。同样要使用 out 参数,方法定义和调用方法均必须显式使用 out 关键字。
案例
下面用一个很简单的例子来解释两者的不同之处
第一种情景:在传递前没有进行参数初始化
ref:
//定义一个加1方法static void Add(ref int n){n += 1; }static void Main(){int number; Add(ref number); //报错:使用了未赋值的局部变量"number"Console.WriteLine(number); Console.ReadKey();}
out:
//定义一个加1方法static void Add(out int n){n += 1; //报错:使用了未赋值的out参数"n" }static void Main(){int number; Add(out number);Console.WriteLine(number); Console.ReadKey();}
在没有进行参数初始化的情况下,两个关键字都出现了报错。ref关键字报错指向了number没有赋值,out关键字报错指向了n没有赋值。
第二种情况:我们在传递之前初始化参数number
ref
//定义一个加1方法static void Add(ref int n){n += 1;}static void Main(){int number = 5; Add(ref number);Console.WriteLine(number); //输出 6Console.ReadKey();}
out
//定义一个加1方法static void Add(out int n){n += 1; //报错:使用了未赋值的out参数"n" }static void Main(){int number = 5; Add(out number);Console.WriteLine(number); Console.ReadKey();}
在有初始化参数的情况下,ref关键字输出正确。而out关键字还是报错,这时我们猜想,会不会再被调用方法中要自己初始化参数n。
第三种情况:out关键字下,传递前初始化参数number,被调用方法内初始化参数n
//定义一个加1方法static void Add(out int n){n = 1; //当修改到此,已无报错。我们立即输出}static void Main(){int number = 5; Add(out number);Console.WriteLine(number); //输出 1Console.ReadKey();}
第四种情况:out关键字下,被调用方法内初始化参数n
//定义一个加1方法static void Add(out int n){n = 1; }static void Main(){int number; Add(out number);Console.WriteLine(number); //输出 1Console.ReadKey();}
在第三第四种情况下out关键字都输出1,可以推出out关键字在传递前可以不初始化参数。
总结:
- ref关键字在传递前需要进行变量初始化,而out关键字可以不要。
- out关键字,在被调用方法内需要再进行一次初始化。
个人心得
- ref和out都是引用传递,但引用传递和引用类型是不同的概念。无论是值类型还是引用类型,ref和out都可以进行修改。
- 使用ref时类似于从家去学校,家里家人叫你小名,学校里别人叫你大名,但无论你在家还是在学校都是你自己,所以你在去学校之前一定要确认自己是真实存在的人即给自己初始化一下,这也就是你无论在哪个地方发生改变,其实都是在改变自己。
但是使用out时有点类似于你在家,
不过你叫别人顶替你的名字去学校。这时候你在家确定自己真实存在不存在无所谓,反正你又不去学校。不过顶替你的人,去了学校要确定下自己的存在即初始化。等那个人回家,他身上的东西就是你的东西,因为在别人看来他就是你,所以你会得到他身上的值。
参考资料:
1)MSDN:ref
2)MSDN:out
了解C#中ref和out关键字的不同相关推荐
- C#中ref和out关键字的应用以及区别。
C#中ref和out关键字的应用以及区别. ref ref的定义 ref 的使用 out out的定义:来自MSDN out的用法 ref和out的区别 Stack Overflow的解释: 之前要学 ...
- c#中ref和out 关键字
问题:为什么c#中要有ref和out?(而java中没有) 需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class ...
- C# ref和out关键字
ref和out关键字初解 参数可以通过引用和值传递给方法.通过引用传递给方法的变量可以有调用它的方法作自由改变,所作的修改会影响原来的变量的值:在C#中,除非特别说明,所有的参数都是值传递. ...
- c#中ref与out的区别
转载:http://zhidao.baidu.com/link?url=pxZpqZuOAWgVk9hhUhqduew4XV-zkycL3OeMhGsoe8PeAkCJtSsXeO_v0H55pcHO ...
- C#方法参数传递-同时使用ref和out关键字
在方法参数传递中,可以同时使用ref和out关键字,但是要注意ref和out参数传递的不同. using System; class Program { static void Main() { ...
- C# ref与out关键字解析
简介:ref和out是C#开发中经常使用的关键字,所以作为一个.NET开发,必须知道如何使用这两个关键字. 1.相同点 ref和out都是按地址传递,使用后都将改变原来参数的数值. 2.ref关键字 ...
- ref 和out 关键字
ref 和out 关键字 通过对CLR的学习,我们可以知道,CLR默认所有方法参数都是传值的.对于引用类型的对象,传递的是对象的引用(指向对象的指针),被调用者拥有该对象的引用的拷贝,能够修改对象,改 ...
- C# 中 ref 和out 的区别
out 参数前必须先为其赋值,即必须由被调用方为其赋值. class TestOut {static void FillArray(out int[] arr){// Initialize the a ...
- Oracle中的保留字(关键字)
字段名在oracle中和保留字冲突了,比如字段名称叫ID,比如字段名称叫sequence等,与oracle的关键字相冲突,这种的解决方法是, 使用字段名的时候前后加上``符号括起来,然后字段大小写要严 ...
最新文章
- STM32 基础系列教程 47 - MD5
- Vue 学习第五天 学习笔记
- ibatis的iterate使用
- stm32+lwip(四):网页服务器测试
- java读取文件夹_Java读取某个文件夹下的所有文件(支持多级文件夹)
- bat截取字符串[转]
- Huntor中国CRM评估报告连载(一)
- linux 扩展挂载盘大小_Linux 挂载新添加磁盘LVM配置
- solr6.0.0 + tomcat8 配置问题
- CGI,FASTCGI,PHP-CGI,PHP-FPM 概念
- CSND如何转载别人的文章
- 计算机上64位数和32位数,一不小心就蓝屏?安装win10系统和软件,你选32位还是64位?...
- Windows常见键盘操作快捷键
- 神秘的乌克兰地狱之门
- 不要和陌生人说话,消息中间件之 Topic
- 极速office(Word)怎么删除背景颜色
- dnfdpl服务器维护了,DNF2019DPL机制介绍 以及本次DPL怪物顺序汇总
- rabbitMq设置多线程并设置线程池消费处理
- 手机个人邮箱怎么注册,手机邮箱注册登录
- 3、Maven核心程序解压与配置
热门文章
- magic操作数据库建表总结
- win8系统下载 mysql 64位 win8_win8系统64位iso镜像
- 怎么使用树莓派和 iPad Pro 备份图片
- 北欧蓝rgb_北欧游戏果酱回顾
- 小公司怎样实施大系统
- 关闭Chrome的网页自动翻译功能
- EFI基本概念之HOB
- 2022高职国家技能大赛(大数据竞赛)-模块E:数据可视化-任务书5
- Gstreamer1.0与imx6q IPU转码 wait_for_comp_timeout 问题解决心路历程
- 虫堡大作战java_《百战天虫:虫堡大作战》详细攻略大全