解析.net中ref和out的实质

http://tech.ddvip.com   2008年09月06日    社区交流

本文详细介绍解析.net中ref和out的实质

  可能是.net中的value type和reference type的关系遇到给函数传递参数的情况时,在我们的脑海里就会浮现按值和按引用传递的概念。如果看见下面这个函数(代码1)我们就会条件反射似的说要给参数加上ref才能使函数内部修改参数的值。

  //代码1

void Change(int a, int b)
{
  int tmp = a;
  a = b;
  b = tmp
}

  ok,那继续看下面这个代码

  //代码2

void Change2(object o)
{
  o = new object();
}
 
static void Main()
{
  object obj = null;
  Change2(obj);
  Console.WriteLine(obj ?? "null");
}

  null? object不是引用类型吗,为什么在函数内对引用类型赋值却没有改变参数的值呢?因为答案只有一个:“所有的参数传递都是按值传递的”。 不要被值类型和引用类型所迷惑,也不要被ref,out关键字所迷惑。如果你了解c或者c++那么这个问题很好理解,所谓ref,out关键字(这两个关键字在IL级别上是相同的,只是在语法上规定ref修饰的参数必须赋值,out修饰的参数可以不赋值。以此区分out这个语义)对于c来说ref int == int*而ref object == object**,而对于c++来说ref int == int&而ref object == object*&.如果你不懂c和c++也没关系,下面我通过反汇编来说明ref和out的本质,有如下测试代码:

  //代码3

static void Ref_Out(ref int a, out int b, int c)
{
  a = 15;
  b = 127;
  c = 99;
}
static void Main()
{
   int i1 = -1;   //ref要有初始值
   int i2;     //out不需要
   Ref_Out(ref i1, out i2, i1);
   Console.WriteLine(i1.ToString() + " " + i2.ToString());  //15 127
}

来源:blog.csdn    作者:傅晗    责编:豆豆技术应用

正在加载评论...