一、参数的一般传递方式
在c#中,除非使用ref或者out前缀,所有参数都通过值来传递。变量的栈数据会完整复制到目标参数中。分为以下3种情况:
1、 引用类型的变量只包含对象所在的内存地址,将要复制的是内存地址而不是对象本身,所以对底层对象的修改会保留。如果在方法内部将内存地址指向一个新对象,则方法结束后在方法中所作的修改会被丢弃(原指针仍指向原对象,方法参数指向新对象,结束后一起销毁)。
代码:
public class Test : MonoBehaviour
{
void Start()
{
C temp = new C();
temp.m = 4;
Debug.Log(string.Format("temp:{0}", temp.m));
TestVar_1(temp);
Debug.Log(string.Format("temp:{0}", temp.m));
TestVar_2(temp);
Debug.Log(string.Format("temp:{0}", temp.m));
TestVar_3(temp);
Debug.Log(string.Format("temp:{0}", temp.m));
}
public void TestVar_1(C tp)
{
tp.m = 5;
}
public void TestVar_2(C tp)
{
C tpl = new C();
tpl.m = 6;
tp = tpl;
}
public void TestVar_3(C tp)
{
tp = new C();
tp.m = 7;
}
}
得到证明
2、 值类型对象包含的是实际数据,传递给方法的是数据本身的副本,对值类型对象的修改在方法结束后会被丢弃。
3、 String类型在实际使用中当做值类型对待。
二、参数的特殊传递方式
1、 ref参数
作用:迫使值参数通过引用传送给方法。
2、 out参数
作用:在参数未初始化的情况下,在一个函数中输出多个值。隐含ref。
C#要求变量在被引用前必须初始化。尽管在传递前,可以用没有意义的值初始化他们,然后用ref引用传递,但有时会引起混乱。用out可以使参数在未初始化情况下使用,逻辑性更强。
3、 params数量可变参数
作用:自动把参数转为数组。
三、传递参数注意事项:
1、 属性不是变量,因此不能传给 out 或ref参数
2、 除非使用out前缀,所有参数必须在使用前初始化。
3、 out参数必须在函数结束前赋值,赋值null也可以。