浅谈C#ref和out
C#中函数的形参和实参之间的传递可以分为值传递和引用传递。
值传递就是指形参是实参的一份拷贝,函数体使用这份拷贝进行运算,函数运行结束后丢弃该拷贝,并不影响实参的值。
引用传递就是将变量的地址传给方法,方法内对该变量的操作会影响该地址所指向内存中的值。C#中ref和out均有该作用。
ref:
ref 关键字使参数按引用传递。当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。
1.若要使用 ref参数,则方法定义和调用方法都必须显式使用 ref 关键字。
class RefTest
{static void Method(ref int i){i = 1;}static void Main(){int val = 0;Method(ref val);// val is now 1}
}
2.传递到 ref 参数的参数必须最先初始化。
class RefTest
{static void Main(string[] args){RefTest rt = new RefTest();int x;int y; //此处x,y没有进行初始化,则编译不通过。rt.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 = 10;y = 1;}
}
出现的错误为:使用了未赋值的局部变量“x”,“y”。故可以说明ref指定的参数无论在函数定义的时候有没有赋予初值,在使用的时候必须初始化。
out:
out 关键字也会使参数按引用传递,这与 ref 关键字类似。
1.若要使用 out参数,方法定义和调用方法都必须显式使用 out 关键字。
class OutTest
{static void Method(out int i){i = 2;}static void Main(){int value;Method(out value);// value is now 2}
}
2.与 ref关键字不同之处在于:
a) ref型传递变量前,变量必须初始化,不能为空的引用,否则编译器会报错。而out型则不需要初始化。
b) out型数据在方法中必须要赋值,否则编译器会报错。而ref型则不需要再方法中赋值。
c) ref型传递变量,数值可以传入方法中,而out型无法将数据传入方法中,参数在进去函数时会清空自己。
换而言之,ref型有进有出,out型只出不进。
class OutTest
{static void Main(string[] args){ OutTest ot = new OutTest();int x=10; int y=233; ot.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;}
}
ref 和 out 关键字在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:
class Example
{// Compiler error CS0663: "Cannot define overloaded// methods that differ only on ref and out".public void SampleMethod(out int i) { }public void SampleMethod(ref int i) { }
}
但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载,如下所示:
class RefOutOverloadExample
{public void SampleMethod(int i) { }public void SampleMethod(out int i) { }
}
浅谈C#ref和out相关推荐
- 浅谈 MySQL 子查询及其优化
2019独角兽企业重金招聘Python工程师标准>>> 使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动 ...
- 多线程之旅之四——浅谈内存模型和用户态同步机制
用户态下有两种同步结构的 volatile construct: 在简单数据类型上原子性的读或者写操作 interlocked construct:在简单数据类型上原子性的读和写操作 (在这里还 ...
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
原文地址: http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学 ...
- 浅谈C#更改令牌ChangeToken
前言 在上篇文章浅谈C#取消令牌CancellationTokenSource[1]一文中我们讲解了CancellationTokenSource,它的主要功能就是分发一个令牌,当我取消令牌我可以进行 ...
- 由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持
由openSession.getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持 Spring和Hibernate的集成的一个要点就是对事务的支持,op ...
- mysql key_len_浅谈mysql explain中key_len的计算方法
mysql的explain命令可以分析sql的性能,其中有一项是key_len(索引的长度)的统计.本文将分析mysql explain中key_len的计算方法. 1.创建测试表及数据 CREATE ...
- 浅谈 Spring IOC
浅谈 Spring IOC 什么是IOC 理解 IOC 和 DI Spring IOC 相关操作个人总结 什么是IOC Ioc-Inversion of Control,即"控制反转&quo ...
- MySQL子查询的优缺点_浅谈mysql的子查询
浅谈mysql的子查询 mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,你可以点击这里 ,这里来获得一些信息,mysql在处理子查询的时候,会 ...
- 浅谈一下个人基于IRIS后端业务开发框架的理解
文章目录 浅谈一下个人基于IRIS后端业务开发框架的理解 现状 方案 具体实现 `Base` `Biz` `Data` `Filter` `Sql` `Imp`.`Ref` `Api` `Util` ...
最新文章
- Js实现点击超链接弹出层,效果仿Discuz登录!
- 一定是h的方式不对阅读_大连二手QH69系列H型钢抛丸机厂商_深蓝永盛二手抛丸机...
- 模拟http中需要注意到的headers字段
- BookSmart Self Publishing
- EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换
- FreeRTOS--API函数
- PowerDesigner V16.5 安装教程以及汉化(数据库建模)
- MySQL数据库(九) 一一 处理重复和SQL注入
- Android 自定义AlertDialog类
- java knn kd树_KNN算法之KD树
- ES7.14报错 Invalid receiver type interface org.apache.http.Header;not a subtype XX.http.NameValuePair
- 如何避免服务器被恶意网络攻击
- 安装双系统/误删导致原来的引导分区中的boot丢失的解决方案
- geojson和topojson数据格式
- Java设计模式总结——6大设计原则
- 从零开始用Python搭建Socket服务器(初篇)
- vanish高速反向代理服务器配置
- 全球变暖java_Java实现第九届蓝桥杯全球变暖
- 杂事缠身总分神,不妨试试番茄钟,亲测有效
- 解决《新编全医药学大词典》开机启动及桌面快捷方式的问题
热门文章
- 动态规划01背包问题入门学习,详细笔记,推荐阅读
- Pyinstaller打包附带DLL、图标和压缩EXE方法
- python3.6 +tkinter GUI编程 实现界面化的文本处理工具
- nodejs初探(四)实现一个多人聊天室
- [SHELL实例] (转)最牛B的 Linux Shell 命令 (一)
- this 自引用指针
- 桌面恶心的无法删除的图标之 淘宝购物 删除办法
- 网上邻居不能正常访问的处理
- Split的使用(C#)
- [转载] pythonjson构建二维数组_python二维键值数组生成转json的例子