马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

关于ref的一个细节点

  [复制链接]
查看9245 | 回复9 | 2013-3-20 16:56:10 | 显示全部楼层 |阅读模式
      关于ref的作用相信大家都清楚,所以在这里就不做过多的介绍了。但是有这样一个问题,但需要传递的参数是引用类型的时候,我们还需要加ref么。举个简单的例子,有一个Sort方法,需要对数组进行排序(前面的帖子说过:数组是引用类型)。比如需要对整型数组int[] myArray进行排序,那么 Sort( myArray )和 Sort( ref myArray )有区别么?
      从运行结果来看,没有任何的区别。但从运行过程中关于内存的处理还是有一点区别的。
      我们知道,引用类型的数据是在托管堆上,传递的是在栈上的引用(可以理解为C++中的指针)。

ref

ref

   在传递过程中,如果不适用ref,则传递的是原值的一份赋值,如果使用ref,则传递的是原来的值。针对于引用类型,如果不适用ref,则在传递的时候,会在栈中另创建一个myArray1的引用,指向的是和myArray一样的托管堆中的内容。如果在前面添加引用,则会直接传递myArray这个引用。所以在引用类型前面加ref还是有区别的。不过这点区别(或者说额外创建引用的这点开销)是很小的,所以平时我们在写代码的时候不必刻意的在参数面前写上ref。
分析下面的代码
已知 int[] myArray = new int[5] { 1, 2, 3, 4, 5};
分别有两个方法
方法1
[C#] 纯文本查看 复制代码
static void Out(int[] myArray)
        {
            myArray = new int[1] { 0 };
            myArray[0] = 10;
        }


方法2
[C#] 纯文本查看 复制代码
static void Out(ref int[] myArray)
        {
            myArray = new int[1] { 0 };
            myArray[0] = 10;
        }

如果分别调用Out(myArray)和 Out(ref myArray),则myArray[0]是多少?
结果是 1 和 10.
大家用这个结果再结合上面的分析,就明白ref在引用类型上的区别了
ibcadmin | 2013-3-20 23:43:20 | 显示全部楼层
ref这个 我到现在都不知道原理 怎么用
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
hebutyll | 2013-3-21 08:52:54 | 显示全部楼层
ibcadmin 发表于 2013-3-20 23:43
ref这个 我到现在都不知道原理 怎么用

如果不适用ref,在传值过程中,系统会在栈中重新创建一个指针,指向原来的地址,如果添加ref,就不会创建新的指针,会直接把原来的地址给传过来
ibcadmin | 2013-3-21 14:02:51 | 显示全部楼层
所以说。 我还是不能理解
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
hebutyll | 2013-3-21 14:21:13 | 显示全部楼层
ibcadmin 发表于 2013-3-21 14:02
所以说。 我还是不能理解

额,可能是我的表达有问题吧,你搜一下网上的解释吧,原理肯定是这样的,其他人的表述应该会更清楚一些
ibcadmin | 2013-3-21 18:27:53 | 显示全部楼层
好吧
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
阴霾中的阳光 | 2013-4-1 15:21:19 | 显示全部楼层
引用类型一般来说没有必要加ref。但是加和不加还是有细微的差别的。
如果不加的话,会复制一个引用,当然和原引用引用的是同一个对象
如果加的话,就是同一个引用了
是这个意思吗
阴霾中的阳光 | 2013-4-1 15:21:56 | 显示全部楼层
其实我就是想知道:
我们在用引用传递的时候
什么情况下用ref  什么情况下不加ref呢
IoveBC | 2013-5-23 09:33:06 | 显示全部楼层
ref这个代码我们老师教过,但是老师教给我们的原理是传递一个原本的值,比如在main()函数中说定义一个变量,那么通过一个函数的参数经过ref引用之后,那么传递回去的数值会把原来的变量值修改。是不是这个意思?
chao2332601 | 2013-6-16 03:31:36 | 显示全部楼层
谢谢分享!!!
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则