C#中ref和out关键字的应用以及区别。

  • ref
    • ref的定义
    • ref 的使用
  • out
    • out的定义:来自MSDN
    • out的用法
  • ref和out的区别
    • Stack Overflow的解释:

之前要学习一下C#的更深入的东西时,看到了ref和out的概念。看了一些教程之后,感觉还是明白了用法,但是不知道语言的深层含义。所以整理了一番,写成博客,帮助大家可以理解,并且于我,也是一个重新整理思路的过程。
首先国际惯例,要了解一个东西的时候,首先明白它是什么,然后明白它能做什么,最后要知道为什么。

ref

ref的定义

ref:MSDN的定义为:“The ref keyword indicates a value that is passed by reference.”就是通过引用来传递参数。ref也是Reference的缩写。了解了定义之后,ref怎么用呢?首先我们要明白值类型和引用类型的概念。这里的ref基本上就是服务于值类型的。

ref 的使用

//不使用 ref;
void Method(int myRefInt)
{myRefInt += 66;
}int number = 1;
Method(number);
Console.WriteLine(number);
**//输出 : 1;**
//使用ref
void Method(ref int myRefInt)
{myRefInt += 66;
}int number = 1;
Method(ref number);
Console.WriteLine(number);**//输出:67**

看到这里想必已经明白了:

  • 不使用ref的时候,函数收到的值是1,然后在Method(int myRefInt)方法中,局部变量myRefInt做了累加之后,在方法执行完成之后就已经销毁了。number的值还是1。
  • 使用ref的时候,函数Method(ref int myRefInt)值收到的是number的地址,函数中执行的myRefInt+=66;此时相当于number+=66;直接修改了number地址的值。
    那就可以等处结论了:ref是通过给方法传递值类型的参数,直接操作同一个变量的关键字。

out

out的定义:来自MSDN

  • As a parameter modifier, which lets you pass an argument to a method by reference rather than by value./“out”作为一个参数修饰符,允许您通过引用而不是通过值将参数传递给方法。
  • In generic type parameter declarations for interfaces and delegates, which specifies that a type parameter is covariant./在接口和委托的泛型类型参数声明中,它指定类型参数是协变的。
    今天的语境下,我们只讨论第一种作为引用传递参数的定义。

out的用法

int number;Method(number);void Method(int myRefInt)
{myRefInt = 66;
}Console.WriteLine(number);
//输出:0
int number;Method(out number);void Method(out int myRefInt)
{myRefInt = 66;
}Console.WriteLine(number);
//输出:66

从上述out用法的表现来看,out和ref其实都可以允许通过引用来传递参数。那么问题来了既然ref 、out的作用看起来一样,为什么还定义了两个关键字呢?

ref和out的区别

Stack Overflow的解释:


意思就是:当你在使用ref传递参数的时候,ref修饰的参数必须要有值,但是out可以使用一个未赋值的变量作为参数传递。下面我也用代码做了验证。

 class RefAndOut{public static void OutDouble(out int outInt){outInt = 2;Console.WriteLine("outInt is:"+outInt);}public static void RefDouble(ref int parInt){parInt *= 2;Console.WriteLine("refInt is:"+parInt);Console.ReadKey();}public static void NormalDouble(int IntPar){IntPar = 1;IntPar *= 2;Console.WriteLine("normalInt is:" + IntPar);Console.ReadKey();}static void Main(string[] args){int refInt;int outInt;int normalInt;OutDouble(out outInt);RefDouble(ref refInt);NormalDouble(normalInt);}}

这段代码在两处地方有错误:即在使用ref,和不使用修饰符的时候,必须要传递一个有值的参数。所以你看,ref和out几乎就只有一个区别,那就是out可以使用未赋值的变量。

但是此处还有一个未解的地方,就是为什么Out不需要赋值呢?这也是这篇博客拖了一周的原因。。今天大概能解释了。我们看下图,不管有没有对静态变量outInt赋值,只要出使用out修饰符,就必须对out修饰的参数outIntPar赋值。
所以out应该是在方法内部做了分配地址的操作,然后把地址赋给外部的变量。但是ref的话是直接传递外部地址进方法。OK至此已经解释清楚ref和out的区别了。
如果有错误的地方还请指出一同讨论。

C#中ref和out关键字的应用以及区别。相关推荐

  1. c#中ref和out 关键字

    问题:为什么c#中要有ref和out?(而java中没有) 需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class ...

  2. 了解C#中ref和out关键字的不同

    在学习C#过程中,遇到了ref和out关键字.他们两的用法很像但是又有所不同,在深入了解后结合自己的看法,做个笔记总结一下.小白第一次写博文,如有什么错误的地方欢迎指正 认识ref和out 要发现两个 ...

  3. 【C#】C#中的ref、out关键字的应用与区别

    目录 01. 本文背景 02.ref的定义与使用 03.out的定义与使用 04.ref与out的区别 05.小结 01. 本文背景 原本我是一个地地道道的C/C++开发者,我其实很难想象有一天我会去 ...

  4. C# ref和out关键字

    ref和out关键字初解     参数可以通过引用和值传递给方法.通过引用传递给方法的变量可以有调用它的方法作自由改变,所作的修改会影响原来的变量的值:在C#中,除非特别说明,所有的参数都是值传递. ...

  5. c#中ref与out的区别

    转载:http://zhidao.baidu.com/link?url=pxZpqZuOAWgVk9hhUhqduew4XV-zkycL3OeMhGsoe8PeAkCJtSsXeO_v0H55pcHO ...

  6. C#方法参数传递-同时使用ref和out关键字

    在方法参数传递中,可以同时使用ref和out关键字,但是要注意ref和out参数传递的不同. using System; class Program { static void Main() {    ...

  7. C# ref与out关键字解析

    简介:ref和out是C#开发中经常使用的关键字,所以作为一个.NET开发,必须知道如何使用这两个关键字. 1.相同点 ref和out都是按地址传递,使用后都将改变原来参数的数值. 2.ref关键字 ...

  8. ref 和out 关键字

    ref 和out 关键字 通过对CLR的学习,我们可以知道,CLR默认所有方法参数都是传值的.对于引用类型的对象,传递的是对象的引用(指向对象的指针),被调用者拥有该对象的引用的拷贝,能够修改对象,改 ...

  9. C# 中 ref 和out 的区别

    out 参数前必须先为其赋值,即必须由被调用方为其赋值. class TestOut {static void FillArray(out int[] arr){// Initialize the a ...

最新文章

  1. C语言注释的匹配的正则表达式
  2. 【Java 网络编程】UDP API 简介 ( DatagramSocket | DatagramPacket )
  3. 4.录屏软件录屏端和接收端程序
  4. 一页纸项目管理模板_项目管理职场必备读物!这一次全部送给你!
  5. c语言如何把变量按位颠倒,求答案,用C语言编程,用户输入一个正整数,把他的各位数字前后颠倒,并输入点到后的结果...
  6. python中 yield 的用法详解——最简单,最清晰的解释(排序节省内存消耗)
  7. EF异常:“System.InvalidOperationException”类型的未经处理的异常在 mscorlib.dll 中发生
  8. 算下平均分:Excel中Average 、Averagea 函数的使用
  9. js几种加密/解密方法
  10. Asp.net web服务处理程序(第六篇)
  11. 微信小程序---详情页
  12. 计算机丢失lame,【图片】小白求教如何设置lame.exe(为无损转320K MP3)求告知。【foobar2000吧】_百度贴吧...
  13. Linux学习笔记精华总结(选自鸟哥的Linux私房菜)
  14. 基于PHP的校园失物招领平台(自动匹配推送)
  15. Cracker学习——任务1
  16. 中间件常见安全漏洞(转载)
  17. 计蒜客_Lpl and Energy-saving Lamps_线段树
  18. 计算机 打印 速度慢,处理打印机在打印文件时打印速度过慢的原因
  19. Excel -- 实用技巧
  20. 使用jsoup入门java爬虫 案例

热门文章

  1. 外设驱动库开发笔记40:AT25xxx外部存储器驱动
  2. 如何制作手机上图文并茂的加密电子书?
  3. solidworks正版多少钱_SOLIDWORKS 2020、2021正版软件价格是多少钱?SW官方报价_专业版和白金版...
  4. 4G物联卡跟NB物联卡有什么区别
  5. 嵌入式C设计模式---职责链设计模式
  6. 私人定制外贸精准获客产品 外贸智能获客系统 好选客
  7. linux动画制作软件,如何在Ubuntu中安装2D动画软件OpenToonz
  8. (翻译)标签云(Tag Cloud)
  9. 赛酷软件测试自学,赛酷ocr怎么用 赛酷ocr使用方法
  10. 双向链表、环形链表及约瑟夫问题