我们都知道ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。对传值调用使用ref相信大家都有经验,对传递本身就是引用类型的参数有什么别的不同吗?请看例子:
using
System;
namespace
ConsoleApplication2
{
public class Employee
{
private string name;
public Employee()
{
}
public string Name
{
get { return name; }
set { name = value; }
}
}
public class Test
{
public static void CallEmployee(Employee e)
{
e.Name = "Zhang";
}
public static void CallEmployeeByRef(ref Employee e)
{
e.Name = "Zhang";
}
public static void CallNewEmployee(Employee e)
{
e = new Employee();
e.Name = "li";
}
public static void CallNewEmployeeByRef(ref Employee e)
{
e = new Employee();
e.Name = "li";
}
public static void Main()
{
Employee E1 = new Employee();
E1.Name = "Wang";
CallEmployee(E1);
Console.WriteLine(E1.Name);
Employee E2 = E1;
CallEmployeeByRef(ref E2);
Console.WriteLine(E2.Name);
if (Object.ReferenceEquals(E1, E2))
{
Console.WriteLine("Equals.");
}
else
{
Console.WriteLine("Not Equals.");
}
Employee E3 = new Employee();
E3.Name = "Wang";
CallNewEmployee(E3);
Console.WriteLine(E3.Name);
Employee E4 = E3;
CallNewEmployeeByRef(ref E4);
Console.WriteLine(E4.Name);
if (Object.ReferenceEquals(E3, E4))
{
Console.WriteLine("Equals.");
}
else
{
Console.WriteLine("Not Equals.");
}
}
}
}
第一次输出“Equals.”,而第二次输出“Not Equals.”。可见,不光按引用传递值类型是有用的, ref 对于传递引用类型也是很有用的。这允许被调用的方法修改该引用所引用的对象,因为引用本身是按引用来传递的。上面的示例显示出当引用类型作为 ref 参数传递时,可以更改对象本身。