解释下面程序的输出?

问题描述:

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; 

    } 

} 

运行上述程序后,我得到“1”作为答案,我无法理解如何?谁能解释,根据我的答案应该是“3” -Thanks解释下面程序的输出?

但是,当我叫其定义如下FUNC1方法: -

private void Func1(Employee e) 
{ 
    e.Name = "2"; 
} 

我得到“2”作为回答。现在,如果e作为值类型传递,那么它是如何给我“2”作为答案?

这里是让你对于Func2位:

private void Func2(Employee e) 
{ 
    Employee e2 = new Employee { Name = "3" }; 
    e = e2; 
} 

Employee是引用类型(A类),但参考本身是按值传递 - 这是一个复制的参考。

然后,您将为此副本分配一个新的参考,但原始参考(从中复制)未更改。因此,你会得到一个1

如果你通过了参考本身的参考,你可以修改它:

private void Func2(ref Employee e) 
{ 
    Employee e2 = new Employee { Name = "3" }; 
    e = e2; 
} 

以上会产生3,如你预期。


更新,关于你的加入Func1

参考是一个副本,但仍指向相同对象 - 你正在改变这个对象的状态(设置Name属性),而不是底层对象引用本身。

当您拨打Func2时,它会通过值传递参考。在方法内部分配e不会更改存储在emp中的值,它只会为本地变量e分配一个不同的值。

如果您想通过参考使用ref关键字。

Func2(ref emp); 

private void Func2(ref Employee e) 
{ 
    // etc... 
} 

func2您正在创建一个员工的新实例并为其分配一个值。在func1中,你只是修改一个已经创建的实例,所以这个改变就会反射回来。

+0

是的我在Func2中创建了一个新的实例,但是在更改了name属性后,我将这个新创建的实例分配给了已经创建的实例,这就是为什么我认为它应该反映 –