C#中ref和out关键字的应用以及区别。
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关键字的应用以及区别。相关推荐
- c#中ref和out 关键字
问题:为什么c#中要有ref和out?(而java中没有) 需求假设:现需要通过一个叫Swap的方法交换a,b两个变量的值.交换前a=1,b=2,断言:交换后a=2,b=1. 现编码如下: class ...
- 了解C#中ref和out关键字的不同
在学习C#过程中,遇到了ref和out关键字.他们两的用法很像但是又有所不同,在深入了解后结合自己的看法,做个笔记总结一下.小白第一次写博文,如有什么错误的地方欢迎指正 认识ref和out 要发现两个 ...
- 【C#】C#中的ref、out关键字的应用与区别
目录 01. 本文背景 02.ref的定义与使用 03.out的定义与使用 04.ref与out的区别 05.小结 01. 本文背景 原本我是一个地地道道的C/C++开发者,我其实很难想象有一天我会去 ...
- C# ref和out关键字
ref和out关键字初解 参数可以通过引用和值传递给方法.通过引用传递给方法的变量可以有调用它的方法作自由改变,所作的修改会影响原来的变量的值:在C#中,除非特别说明,所有的参数都是值传递. ...
- c#中ref与out的区别
转载:http://zhidao.baidu.com/link?url=pxZpqZuOAWgVk9hhUhqduew4XV-zkycL3OeMhGsoe8PeAkCJtSsXeO_v0H55pcHO ...
- C#方法参数传递-同时使用ref和out关键字
在方法参数传递中,可以同时使用ref和out关键字,但是要注意ref和out参数传递的不同. using System; class Program { static void Main() { ...
- C# ref与out关键字解析
简介:ref和out是C#开发中经常使用的关键字,所以作为一个.NET开发,必须知道如何使用这两个关键字. 1.相同点 ref和out都是按地址传递,使用后都将改变原来参数的数值. 2.ref关键字 ...
- ref 和out 关键字
ref 和out 关键字 通过对CLR的学习,我们可以知道,CLR默认所有方法参数都是传值的.对于引用类型的对象,传递的是对象的引用(指向对象的指针),被调用者拥有该对象的引用的拷贝,能够修改对象,改 ...
- C# 中 ref 和out 的区别
out 参数前必须先为其赋值,即必须由被调用方为其赋值. class TestOut {static void FillArray(out int[] arr){// Initialize the a ...
最新文章
- C语言注释的匹配的正则表达式
- 【Java 网络编程】UDP API 简介 ( DatagramSocket | DatagramPacket )
- 4.录屏软件录屏端和接收端程序
- 一页纸项目管理模板_项目管理职场必备读物!这一次全部送给你!
- c语言如何把变量按位颠倒,求答案,用C语言编程,用户输入一个正整数,把他的各位数字前后颠倒,并输入点到后的结果...
- python中 yield 的用法详解——最简单,最清晰的解释(排序节省内存消耗)
- EF异常:“System.InvalidOperationException”类型的未经处理的异常在 mscorlib.dll 中发生
- 算下平均分:Excel中Average 、Averagea 函数的使用
- js几种加密/解密方法
- Asp.net web服务处理程序(第六篇)
- 微信小程序---详情页
- 计算机丢失lame,【图片】小白求教如何设置lame.exe(为无损转320K MP3)求告知。【foobar2000吧】_百度贴吧...
- Linux学习笔记精华总结(选自鸟哥的Linux私房菜)
- 基于PHP的校园失物招领平台(自动匹配推送)
- Cracker学习——任务1
- 中间件常见安全漏洞(转载)
- 计蒜客_Lpl and Energy-saving Lamps_线段树
- 计算机 打印 速度慢,处理打印机在打印文件时打印速度过慢的原因
- Excel -- 实用技巧
- 使用jsoup入门java爬虫 案例
热门文章
- 外设驱动库开发笔记40:AT25xxx外部存储器驱动
- 如何制作手机上图文并茂的加密电子书?
- solidworks正版多少钱_SOLIDWORKS 2020、2021正版软件价格是多少钱?SW官方报价_专业版和白金版...
- 4G物联卡跟NB物联卡有什么区别
- 嵌入式C设计模式---职责链设计模式
- 私人定制外贸精准获客产品 外贸智能获客系统 好选客
- linux动画制作软件,如何在Ubuntu中安装2D动画软件OpenToonz
- (翻译)标签云(Tag Cloud)
- 赛酷软件测试自学,赛酷ocr怎么用 赛酷ocr使用方法
- 双向链表、环形链表及约瑟夫问题