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;}
}
出现错误:使用了未赋值的out参数“a”,"b"
则在swap函数定义时候给a,b赋上初值则运行正确。

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相关推荐

  1. 浅谈 MySQL 子查询及其优化

    2019独角兽企业重金招聘Python工程师标准>>> 使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动 ...

  2. 多线程之旅之四——浅谈内存模型和用户态同步机制

     用户态下有两种同步结构的 volatile construct: 在简单数据类型上原子性的读或者写操作   interlocked construct:在简单数据类型上原子性的读和写操作 (在这里还 ...

  3. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学 ...

  4. 浅谈C#更改令牌ChangeToken

    前言 在上篇文章浅谈C#取消令牌CancellationTokenSource[1]一文中我们讲解了CancellationTokenSource,它的主要功能就是分发一个令牌,当我取消令牌我可以进行 ...

  5. 由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持

    由openSession.getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持 Spring和Hibernate的集成的一个要点就是对事务的支持,op ...

  6. mysql key_len_浅谈mysql explain中key_len的计算方法

    mysql的explain命令可以分析sql的性能,其中有一项是key_len(索引的长度)的统计.本文将分析mysql explain中key_len的计算方法. 1.创建测试表及数据 CREATE ...

  7. 浅谈 Spring IOC

    浅谈 Spring IOC 什么是IOC 理解 IOC 和 DI Spring IOC 相关操作个人总结 什么是IOC Ioc-Inversion of Control,即"控制反转&quo ...

  8. MySQL子查询的优缺点_浅谈mysql的子查询

    浅谈mysql的子查询 mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,你可以点击这里 ,这里来获得一些信息,mysql在处理子查询的时候,会 ...

  9. 浅谈一下个人基于IRIS后端业务开发框架的理解

    文章目录 浅谈一下个人基于IRIS后端业务开发框架的理解 现状 方案 具体实现 `Base` `Biz` `Data` `Filter` `Sql` `Imp`.`Ref` `Api` `Util` ...

最新文章

  1. Js实现点击超链接弹出层,效果仿Discuz登录!
  2. 一定是h的方式不对阅读_大连二手QH69系列H型钢抛丸机厂商_深蓝永盛二手抛丸机...
  3. 模拟http中需要注意到的headers字段
  4. BookSmart Self Publishing
  5. EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换
  6. FreeRTOS--API函数
  7. PowerDesigner V16.5 安装教程以及汉化(数据库建模)
  8. MySQL数据库(九) 一一 处理重复和SQL注入
  9. Android 自定义AlertDialog类
  10. java knn kd树_KNN算法之KD树
  11. ES7.14报错 Invalid receiver type interface org.apache.http.Header;not a subtype XX.http.NameValuePair
  12. 如何避免服务器被恶意网络攻击
  13. 安装双系统/误删导致原来的引导分区中的boot丢失的解决方案
  14. geojson和topojson数据格式
  15. Java设计模式总结——6大设计原则
  16. 从零开始用Python搭建Socket服务器(初篇)
  17. vanish高速反向代理服务器配置
  18. 全球变暖java_Java实现第九届蓝桥杯全球变暖
  19. 杂事缠身总分神,不妨试试番茄钟,亲测有效
  20. 解决《新编全医药学大词典》开机启动及桌面快捷方式的问题

热门文章

  1. 动态规划01背包问题入门学习,详细笔记,推荐阅读
  2. Pyinstaller打包附带DLL、图标和压缩EXE方法
  3. python3.6 +tkinter GUI编程 实现界面化的文本处理工具
  4. nodejs初探(四)实现一个多人聊天室
  5. [SHELL实例] (转)最牛B的 Linux Shell 命令 (一)
  6. this 自引用指针
  7. 桌面恶心的无法删除的图标之 淘宝购物 删除办法
  8. 网上邻居不能正常访问的处理
  9. Split的使用(C#)
  10. [转载] pythonjson构建二维数组_python二维键值数组生成转json的例子