把 ref 和 out 关键字说透 (三)

2014-11-23 23:36:36 · 作者: · 浏览: 46
ode size 5 (0x5)
.maxstack 8
IL_0000: nop
IL_0001: ldnull
IL_0002: starg.s a
IL_0004: ret
} // end of method Program::Test1
.method private hidebysig static
void Test2 (
object & a
) cil managed
{
// Method begins at RVA 0x2059
// Code size 5 (0x5)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0 //多了这行代码
IL_0002: ldnull
IL_0003: stind. ref
IL_0004: ret
} // end of method Program::Test2

上面是直接传入,并赋 null 值的

下面是加 ref 的

我们可以发现仅仅是多了一行代码:IL_0001: ldarg.0

其实,这样代码的作用就是讲参数0加载到堆栈上,也就是先根据引用,找到了外部的变量,然后再根据外部的变量,找到了最终的对象!

那现在你知道什么时候该加 ref,什么时候不用加 ref 了吗?

再看了一个例子:

1
2
3
4
5
6
7
8
private static void Test1(List< int > list)
{
list.Clear();
}
private static void Test2( ref List< int > list)
{
list = new List< int >();
}

同样是清空一个 List,如果没加 ref ,只能用 clear。

而加了 ref 后可以直接 new 一个新的~

如果你没加 ref 就直接 new 一个新的了,抱歉,外部根本不知道有这个东西,你们操作的将不是同一个 List

所以,你一定要了解这点,并注意一下几件事:

1、一般情况下不要用 ref

2、如果你没加 ref,千万别直接给它赋值,因为外面会接收不到…

现在你全部明白了吗?^_^

原文地址:把 ref 和 out 关键字说透