class Program
{
static void Main(string[] args)
{
A a = new A();
a.print();
}
}
class Employee
{
public string Name { get; set; }
}
class A
{
public void print()
{
Employee emp = new Employee { Name = "1" };
Func2(emp);
Console.WriteLine(emp.Name);
Console.ReadLine();
}
private void Func2(Employee e)
{
Employee e2 = new Employee { Name = "3" };
e = e2;
}
}
运行Above程序后,我得到“1”作为答案,我无法理解如何?任何人都可以解释,根据我的答案应该是“3” -Thanks
但是当我调用下面定义的Func1方法时: -
private void Func1(Employee e)
{
e.Name = "2";
}
我得到“2”作为答案。现在如果e被作为Value类型传递,那么它为什么会给我“2”作为答案呢?
答案 0 :(得分:8)
以下是关于Func2
:
private void Func2(Employee e)
{
Employee e2 = new Employee { Name = "3" };
e = e2;
}
Employee
是引用类型(类),但引用本身是按值传递的 - 它是引用的副本。
然后,您正在为此副本分配新引用,但原始引用(已从中复制)未更改。因此,您获得了1
。
如果您通过引用传递引用本身,则可以对其进行修改:
private void Func2(ref Employee e)
{
Employee e2 = new Employee { Name = "3" };
e = e2;
}
上述内容会产生3
,如您所料。
更新,关于您添加的Func1
:
引用是一个副本,但仍然指向相同的对象 - 您正在更改此对象的状态(设置Name
属性),而不是基础对象引用本身
答案 1 :(得分:2)
当您致电Func2
时,会按价值传递参考。在方法内部分配e
不会更改emp
中存储的值,只会为局部变量e
分配不同的值。
如果您想通过引用传递,请使用ref
关键字。
Func2(ref emp);
private void Func2(ref Employee e)
{
// etc...
}
答案 2 :(得分:0)
在func2
中,您正在创建一个新的员工实例并为其分配值。在func1
中,您只是修改已创建的实例,因此反映了更改。