原文:https://blog.csdn.net/sinat_23079759/article/details/52895385

不知大家有没有遇到过需要一个函数返回多个值的情况。
当写代码要返回多个值的时候,当然可以返回一个数组来实现,但如果遇到需要返回的多个值的类型不同呢?这个时候怎么办?

c#中,out关键字和ref关键字就起作用了。(且out更适合用到多返回值的地方)

一个函数中,使用out或ref作为形参前的关键字,那么在函数体中只要修改过这个形参,之前调用这个函数时赋给对应形参的实参的值也会修改。这是怎么实现的呢?它的机理就是,使用out 和ref修饰的形参是引用类型,而不是值类型,也就是说它们所存储的信息是地址,而不是值类型。

既然都是存储的地址,那么它们有什么区别呢?
我整理了一下,主要有以下几点区别:
1,ref 要求变量必须在传递之前进行初始化(赋初值),但调用时可以对它什么也不做;而out 在调用之前,并不需要为这一形参的变量赋予初始值。
2,out 只能用来将值从方法中传出。不管外界是什么值,使用了out是要把参数清空的,然后函数体中必须对其赋值。也就是说,在调用之时的函数体内部必须对out修饰的变量赋值。
简单说就是ref有进有出(或无出),out无进有出。

示例代码如下,

ref的使用:

class Program{static void Main(string[] args){Program pg = new Program();int x =0;int y = 0;pg.getnull(ref x, ref y);//这里x,y必须为已经赋过初值的,否则编译不通过Console.WriteLine("x=" + x + ",y=" + y);//输出为:x=0,y=0,原值没有改变,因为是空方法pg.GetValue(ref x, ref y);//这里x,y已经赋过初值的Console.WriteLine("x=" + x + ",y=" + y);//输出为:x=1,y=2Console.ReadLine();}public void getnull(ref int x, ref int y){}public void GetValue(ref int x, ref int y){x++;y = y + 2;}}

out的使用:

 class Program{static void Main(string[] args){Program pg = new Program();int x =0;int y = 0;pg.getnull(out x,out y);//这里x,y不需要赋初值,赋了也没关系,但会清零;注意:** 调用函数时必须写关键字out ** 因为参数与关键字是一起传递的Console.WriteLine("x=" + x + ",y=" + y);//输出为:x=3,y=3,原值没有改变,因为是空方法pg.GetValue(out x, out y);//这里x,y已经赋过初值的Console.WriteLine("x=" + x + ",y=" + y);//输出为:x=12,y=21Console.ReadLine();}public void getnull(out int x, out int y)//如果函数体中没有给x,y赋初值(即下面函数体为空),那么编辑器会提示“控制离开当前方法之前必须对out参数x赋初值”,编译不通过{x = 3;//这里我们赋值,不赋值编译不通过y = 3;}public void GetValue(out int x, out int y){//x++;//同样如果这么写会提示“使用了未赋值的out参数 x”,所以不可以这么直接 x++//y = y + 2;//同上//我们改为下边写法,就可以编译通过x = 12;y = 12;//这个函数和getnull的功能就完全相同了}}

可能又有同学会问我们有必要使用out和ref吗?使用静态变量不是也可以吗?
确实可以,但这降低了代码的耦合度,造成阅读困难和日后的修改的不便。

c#中的关键字out是什么意思?ref是什么意思?它们有什么区别?相关推荐

  1. 【Java_基础】Java中Native关键字的作用

    本篇博文转载与:Java中Native关键字的作用 转载于:https://www.cnblogs.com/leiblog/p/10529056.html

  2. C/C++中extern关键字详解

    1 基本解释 :extern可以置于变量或者函数 前,以标示变量或者函数的定义在别的文件中 ,提示编译器遇到此变量和函数时在其他模块中寻找其定义 .此外extern也可用来进行链接指定. 也就是说ex ...

  3. C语言中的关键字详略

    首先我们要注意:在C语言中define不是关键字.define是编译器的预编译指令,是编译器实现的,不是C语言的内容. C语言编译器不认识#开头的东西,那些是预处理的事情. C编译器看到的是预处理完成 ...

  4. java中final关键字的使用

    final 中文翻译为 最终的,在java中也是较为常用的关键字之一. 在java 中 final 关键字可以修饰  类.方法.变量 final 修饰在类上,则表示该类不能被继承,如果里面的成员变量没 ...

  5. JavaScript中this关键字使用方法详解

    在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的.JavaScrip ...

  6. C++中explicit关键字的作用

    C++中explicit关键字的作用 explicit用来防止由构造函数定义的隐式转换. 要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. ...

  7. java 中关键字_Java中的关键字

    Java中的关键字一共有53个,包含常用的51个关键字和2个保留字 1.   保留字 2个:预留的关键字,即Java中未被使用到的关键字 const 保留字,即预留的关键字 goto 保留字,即预留的 ...

  8. java中的关键字static

    原文链接: https://zhuanlan.zhihu.com/p/70110497 昨晚面试中被问到,没能回答出来.这篇答疑文章写得非常好,无一字可增删,遂直接复制. 在平时开发当中,我们经常会遇 ...

  9. 在Oracle中exception关键字,Oracle表字段有Oracle关键字出现异常解决方案

    一.问题由来 现在进行项目改造,数据库需要迁移,由原来的使用GBase数据库改为使用Oracle数据库,今天测试人员在测试时后台报了一个异常. 把SQL语句单独复制出来进行查询,还是报错,仔细分析原因 ...

  10. 关于Oracle数据库19c中的关键字和保留字的说明

    关于Oracle数据库中的关键字和保留字的说明 官方文档节选: ​ You cannot use Oracle SQL reserved words as nonquoted identifiers. ...

最新文章

  1. Python3 try-except、raise和assert解析
  2. mongodb-创建索引
  3. 深度学习~循环神经网络RNN, LSTM
  4. python如何初始化一个二维数组_使用Python实现一个简单的商品期货布林指标突破策略...
  5. C# 反射中的GetType
  6. 机器学习的几种方法(knn,逻辑回归,SVM,决策树,随机森林,极限随机树,集成学习,Adaboost,GBDT)
  7. 梯度与散度与拉普拉斯算子
  8. 解决Could not load file or assembly CefSharp.Core.dll的问题
  9. msdb 数据库_如何检索有关存储在MSDB数据库中的SSIS包的信息
  10. python unicode 编程 pdf,Python | Python学习之unicode和utf8
  11. Qt信号阻塞和断开信号槽
  12. Vue学习笔记进阶篇——多元素及多组件过渡
  13. matlab 增量式,matlab增量式pid仿真
  14. 计算机多媒体技术广泛应用于各个领域,计算机多媒体技术的现状及发展前景
  15. 编程之道(英汉对照)[转载]
  16. 【Python数据分析-8】:Numpy常用操作-arange函数、linspace函数与运算
  17. 视频中警戒区 仿射变换
  18. php mail cc,邮件cc是什么意思
  19. 一元二次方程解法的实现(Python)
  20. 优雅使用Jsdelivr/CDN加速博客访问速度

热门文章

  1. 举个栗子!Tableau 技巧(176):快速添加 Server 受信任的 IP
  2. 好不容易进了洞房,解不开新娘的衣服,新郎一怒走天涯,人间惨剧啊!
  3. 22 信息系统安全管理
  4. 简单聊聊FPGA的一些参数——后篇
  5. 使用Databricks作为分析平台
  6. Lytro 一代资料.缘起
  7. radosgw bucket index sharding
  8. R语言统计入门第四章描述性统计和图形——4.6表格的图形显示
  9. BZOJ4355: Play with sequence
  10. 互联网金融系统实现之数据平台交互验证方式