解析.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 作者:傅晗 责编:豆豆技术应用