hebutyll 发表于 2013-3-20 16:56:10

关于ref的一个细节点

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

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

方法2 static void Out(ref int[] myArray)
      {
            myArray = new int { 0 };
            myArray = 10;
      }
如果分别调用Out(myArray)和 Out(ref myArray),则myArray是多少?
结果是 1 和 10.
大家用这个结果再结合上面的分析,就明白ref在引用类型上的区别了

ibcadmin 发表于 2013-3-20 23:43:20

ref这个 我到现在都不知道原理 怎么用

hebutyll 发表于 2013-3-21 08:52:54

ibcadmin 发表于 2013-3-20 23:43 static/image/common/back.gif
ref这个 我到现在都不知道原理 怎么用

如果不适用ref,在传值过程中,系统会在栈中重新创建一个指针,指向原来的地址,如果添加ref,就不会创建新的指针,会直接把原来的地址给传过来

ibcadmin 发表于 2013-3-21 14:02:51

所以说。 我还是不能理解

hebutyll 发表于 2013-3-21 14:21:13

ibcadmin 发表于 2013-3-21 14:02 static/image/common/back.gif
所以说。 我还是不能理解

额,可能是我的表达有问题吧,你搜一下网上的解释吧,原理肯定是这样的,其他人的表述应该会更清楚一些

ibcadmin 发表于 2013-3-21 18:27:53

好吧 {:3_57:}

阴霾中的阳光 发表于 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

谢谢分享!!!
页: [1] 2
查看完整版本: 关于ref的一个细节点