4
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”-谢谢

但是当我调用下面定义的 Func1 方法时:-

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

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

4

3 回答 3

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属性),而不是基础对象引用本身。

于 2012-05-12T19:20:00.533 回答
2

当您调用时,它按值Func2传递引用。在方法内部赋值不会改变存储的值,它只是给局部变量分配一个不同的值。eempe

如果要通过引用传递,请使用ref关键字。

Func2(ref emp);

private void Func2(ref Employee e)
{
    // etc... 
}
于 2012-05-12T19:19:39.713 回答
0

func2您正在创建一个新的员工实例并为其分配一个值。就像func1您只是在修改已经创建的实例一样,因此更改会被反映回来。

于 2012-05-12T19:55:55.680 回答