首先非常感谢Justin Shen ,hBifTs ahnan ,你们的评论使我对此有了更深的了解,但为了完整性,我再罗嗦罗嗦传值还是传参!
在c#里,给我们提供了两种类型的pass by reference方式:out与ref.
1:首先看一下以out关键字标识的传参方式:
A:在被调用方法中任何对参数的改变,都会影响到调用方法中传递给此参数的变量的改变。
B:声明out parament,能够是被调用方法返回多个值,可以声明多个out parament。当然也可以声明一个对象专门来返回多 个值。
C:传递给out parament参数的变量不必被初始化,但被调用函数在返回前必须给out parament赋值。
2:以ref关键字表示的传参方式:
A:在被调用方法中任何对参数的改变,都会影响到调用方法中传递给此参数的变量的改变。
B:传递给out parament参数的变量必须被初始化,所以不适合用来返回多个值的用法。
可以看出,out与ref两种方式,主要的区别在于传递给参数的变量是否需要被初始化。需要注意的是,在out方式中,即使传
递给out param的变量已经被初始化,在被调用函数中还一定要进行assign操作,否则会报错(Use of unassigned local variable 'o')。
比如:
public static void Main()
{
Test first = new Test();
Change(out first);
if(first == null)
Console.WriteLine("Sorry,first is changed by Change method");
else
first.Print();
}
public static void Change(out Test o)
{
o = new Test(); //如果缺少这一条语句的化,不会通过编译的,因为o没有被赋值,即使first已经被初始化了。
//若以ref方式传递,有没有这条语句都不会报错。
o.Name = "It's Changed String";
o = null;
}
运行结果:
Sorry,first is changed by Change method
总结:
1:传值方式:
2 :引用方式: