C#之out和ref区别

out与ref的区别总结:
1.两者都是通过引用来传递。
2.两者都按地址传递的,使用后都将改变原来参数的数值。
3.属性不是变量,因此不能作为 out或ref 参数传递。
4.若要使用 ref 或 out,方法定义和调用方法都必须显式使用 out、ref 关键字。
5.rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。或者说,rel是有进有出,out是只出不进
6.尽管 ref 和 out 在运行时的处理方式不同,但在编译时的处理方式相同。
—6-1.因此,如果一个方法采用 ref 参数(例:Method(ref int i)),而另一个方法采用 out 参数(例:Method(out int i)),则无法重载这两个方法,因为从编译的角度来看,以上两个方法是完全相同的,因此将不会编译方法内的代码
—6-2.但是,如果一个方法采用 ref 或 out 参数(例如:Method(ref/out int i))),而另一个方法不采用这两个参数Method(int i)),则可以进行重载
7.实用场合:out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

代码如下:

 1         public static void Main(string[] args)  2  {  3 //使用out  4 Console.WriteLine("-----------------------------使用OUT的方法-----------------------------");  5 Console.WriteLine("-----------------调用Out方法前参数没赋值-----------------");  6 string outName;  7 string outSchool;  8 int outGrad;  9 outMethod(out outName, out outGrad, out outSchool); 10 Console.WriteLine("学生" + outName + "是:" + outSchool + outGrad + "级学生"); 11 12 Console.WriteLine("-----------------调用Out方法前参数赋值了-----------------"); 13 string outNameValue = "李XX"; 14 string outSchoolValue = "河南大学"; 15 int outGradValue = 2011; 16 outMethod(out outNameValue, out outGradValue, out outSchoolValue); 17 Console.WriteLine("学生" + outNameValue + "是:" + outSchoolValue + outGradValue + "级学生"); 18 19 20 21 //使用ref: 22 Console.WriteLine("-----------------------------使用REF的方法-----------------------------"); 23 string refName = "李XX"; 24 string refSchool = "河南大学"; 25 int refGrad = 2011; 26 Console.WriteLine("-----------------refMethod方法里没赋值-----------------"); 27 refMethod(ref refName, ref refGrad, ref refSchool); 28 Console.WriteLine("学生" + refName + "是:" + refSchool + refGrad + "级学生"); 29 Console.WriteLine("-----------------refMethod方法里赋值了-----------------"); 30 refMethodValue(ref refName, ref refGrad, ref refSchool); 31 Console.WriteLine("学生" + refName + "是:" + refSchool + refGrad + "级学生"); 32 33  Console.ReadLine(); 34  } 35 36 37 38 //outMethod 39 //out方法输出参数特征: 40 //1.不在栈中为形参分配新的内存。 41 //2.形参的名称相当于实参变量的别名,引用与实参相同的内存位置。 42 //3.既然形参和实参引用相同的内存位置,则在方法执行期间,形参所做的任何改变在方法完成之后通过实参变量都是可见的。 43 private static void outMethod(out string name, out int grad, out string school) 44  { 45 name = "王XX"; 46 grad = 2009; 47 school = "郑州大学"; 48 } 49 50 //refMethod 51 //ref方法输出参数特征: 52 //1.不在栈中为形参分配新的内存。 53 //2.形参的名称相当于实参变量的别名,引用与实参相同的内存位置。 54 //3.既然形参和实参引用相同的内存位置,则在方法执行期间,形参所做的任何改变在方法完成之后通过实参变量都是可见的。 55 private static void refMethod(ref string name, ref int grad, ref string school) 56 { 57 58 } 59 private static void refMethodValue(ref string name, ref int grad, ref string school) 60 { 61 name = "王XX"; 62 grad = 2009; 63 school = "郑州大学"; 64 }

 以上代码的输出结果:

由以上的输出结果可以看出:

1、在调用方法outMethod之前变量赋值不赋值没有任何意义,因为out是要把参数清空的,其参数赋值只要在方法内部进行就可以了;即out是只出不进

2、在调用refMethod之前必须给变量赋值,然而在refMethod方法内部参数赋值不赋值均可以,如方法内部重新赋值了则修改其值,如方法内部没重新赋值则不修改其值;rel是有进有出,

转载于:https://www.cnblogs.com/cocoon/p/4997010.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一次ssh登录不成功的解决经历

一、列出解决过程中所有报错信息 ssh connection refused port 22Stopped OpenBSD Secure Shell server. Failed to start OpenBSD Secure Shell server.OpenSSL version mismatch. Built against 1010104f, you have 101000cf Unable to fetch some archives, maybe run apt-…

IOS自动化打包介绍

摘要 随着苹果手持设备用户的不断增加,ios应用也增长迅速,同时随着iphone被越狱越来越多的app 的渠道也不断增多,为各个渠道打包成了一件费时费力的工作,本文提供一种比较智能的打包方式来减少其带来的各种不便。 TAG Ios打包&…

I帧和IDR帧区别

From: http://blog.csdn.net/skygray/article/details/6223358 I 帧和 IDR 帧的区别: IDR 帧属于 I 帧。解码器收到 IDR frame 时,将所有的参考帧队列丢弃 (用x264_reference_reset 函数实现——在 encoder.c 文件中) 。这点是所…

HDU 3486 Interviewe RMQ

题意: 将\(n\)个数分成\(m\)段相邻区间,每段区间的长度为\(\left \lfloor \frac{n}{m} \right \rfloor\),从每段区间选一个最大值,要让所有的最大值之和大于\(k\)。求最小的\(m\)。 分析: 预处理RMQ,维护区…

[react] 举例说明useState

[react] 举例说明useState import { useState } from react; const [count, setCount] useState(0); function Demo() {const doAdd1 () > {setCount(prevCount 1);};const doAdd2 () > {setCount(prevCount > prevCount 1);};return <><h1>{count}…

win10 vscode 无法激活python 虚拟环境的解决办法

一、powershell中 python创建虚拟环境无法激活 二、管理员模式运行powershell&#xff0c;执行策略更改&#xff1a; Set-ExecutionPolicy RemoteSigned&#xff0c;输入y 三、vscode再次激活&#xff1a; .\flask-venv\Scripts\activate 激活成功。 四、退出虚拟环境&#x…

客户端获取游客IP,获取客户地理信息,展示地图

参考自&#xff1a;http://www.cnblogs.com/phphuaibei/archive/2011/09/08/2171903.html 三维地图&#xff0c;目前只有都市圈和E都市有提供。 Google街景可以在浏览器安装google earth插件后显示。转载于:https://blog.51cto.com/icersummer/724481

vscode 升级过后自带的四种终端

一、版本 二、终端 自带了四种默认配置终端&#xff0c;删除以前Edit in settings.json的“terminal.integrated.shell.windows”字段。 四种默认终端&#xff1a; powershellwslcmdjavaScript Debug Terminal

[react] 使用ES6的class定义的组件不支持mixins了,那用什么可以替代呢?

[react] 使用ES6的class定义的组件不支持mixins了&#xff0c;那用什么可以替代呢&#xff1f; HOC 高阶组件是一个以组件为参数并返回一个新组件的函数。HOC 运行你重用代码、逻辑和引导抽象。最常见的可能是 Redux 的 connect 函数。除了简单分享工具库和简单的组合&#xf…

接口委托实现

1 TFMDesign class(TFMBase, IDataSetOperator)2 public3 //注意名称要不一样,重新定义保存方法4 procedure IDataSetOperator.DoApplyUpdates ApplyUpdates;5 6 //重写保存方法7 procedure ApplyUpdates; stdcall;8 9 //接口用对象10 property …

2015第19本:异类--不一样的成功启示录

一位移民加拿大的高中同学在2012年回国探亲&#xff0c;聚会时曾推荐了《异类--不一样的成功启示录》这本书&#xff0c;英文书名叫《Outliers - the story of success》&#xff0c;一直没有系统地看完。在整理Omnifocus的读书列表时又发现了此书&#xff0c;还是趁这个机会把…

windows10 安装mqtt服务器和client客户端进行本地调试

一、安装mqtt服务器 使用emqx作为mqtt服务器&#xff0c;下载emqx-windows-4.3.8.zip。 emqx-windows-4.3.8.zip 其他版本&#xff1a;Directory listing for broker: / | EMQ 解压到自定义目录位置&#xff0c;在cmd窗口进入解压后的bin目录 cd /d D:\Tools\exqxServer\em…

I,P,B帧和PTS,DTS的关系

From: http://www.cnblogs.com/qingquan/archive/2011/07/27/2118967.html 基本概念&#xff1a; I frame &#xff1a;帧内编码帧 又称intra picture&#xff0c;I 帧通常是每个 GOP&#xff08;MPEG 所使用的一种视频压缩技术&#xff09;的第一个帧&#xff0c;经过适度地压…

[react] 为何说虚拟DOM会提高性能?

[react] 为何说虚拟DOM会提高性能&#xff1f; 虚拟dom相当于在js和真实dom中间加了一个缓存&#xff0c;利用dom diff算法避免了没有必要的dom操作&#xff0c;从而提高性能 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定…

不断学习才能进步!

51CTO确实是一个很不错的技术性很强的社交网络&#xff0c;在这里我发现有很多东西值得我去学习&#xff0c;只不过现在从事教师职业&#xff0c;没有太多的时间。但我只要有时间就会来学习的&#xff0c;希望大家能够多多帮助&#xff01;转载于:https://blog.51cto.com/anday…

Windows Subsystem for Linux(WSL)安装emqx

一、安装 win10自带linux子系统&#xff0c;wsl ubuntu&#xff0c;安装方法同ubuntu。 脚本一键安装&#xff1a;curl https://repos.emqx.io/install_emqx.sh | bash 二、使用 $ emqx start emqx 4.0.0 is started successfully! $ emqx_ctl status Node emqx127.0.0.1 i…

丰富“WinForms” 的一个别样项目(学生管理)

一个别样的WinForms项目&#xff0c;他并没多么的新颖&#xff0c;但是它的用处确实有点多&#xff0c;或许会有你需要的地方&#xff1b;如果你对WinForms中那么多控件无法把握&#xff0c;又或者是你根本就不懂&#xff0c;那我觉得你应该好好看看&#xff0c;如果一个人的人…

opengl与Directx的区别

From: http://blog.163.com/xtdx888888126/blog/static/2955727520083661133565/ OpenGL 只是图形函数库。 DirectX 包含图形, 声音, 输入, 网络等模块。 单就图形而论, DirectX 的图形库性能不如 OpenGL OpenGL稳定&#xff0c;可跨平台使用。但 OpenGL 多需要显卡支持. …

[react] shouldComponentUpdate方法是做什么的

[react] shouldComponentUpdate方法是做什么的 shouldComponentUpdate是React组件的生命周期&#xff0c;在组件更新后触发&#xff0c;该方法继承子React.Component.方法的作用是可以在内部比较更新前后的state和props的值&#xff0c;手动控制当前组件是否需要执行render函数…

OSPF区域不能与area 0 相连的解决方法

有些时候&#xff0c;由于区域包含的路由器过多或区域的地理位置原因等&#xff0c;造成网络中配置的OSPF区域&#xff08;非area 0&#xff09;不能够与area 0相连。大家都知道&#xff0c;在OSPF的所有区域内&#xff0c;area 0 是骨干区域&#xff0c;非0区域都要与area0相连…