解释下面的程序输出?

Dee*_*rma 4 c# oop

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;

    }

}
Run Code Online (Sandbox Code Playgroud)

运行Above程序后,我得到"1"作为答案,我无法理解如何?任何人都可以解释,根据我的答案应该是"3" - 谢谢

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

private void Func1(Employee e)
{
    e.Name = "2";
}
Run Code Online (Sandbox Code Playgroud)

我得到"2"作为答案.现在,如果e作为Value类型传递,那么为什么它会给我"2"作为答案呢?

Ode*_*ded 8

这是让你了解的一点Func2:

private void Func2(Employee e)
{
    Employee e2 = new Employee { Name = "3" };
    e = e2;
}
Run Code Online (Sandbox Code Playgroud)

Employee是一个引用类型(类),但引用本身是按值传递的 - 它是引用的副本.

然后,您将为此副本分配新引用,但原始引用(从中复制)未更改.因此,你得到了一个1.

如果您通过引用传递引用本身,则可以对其进行修改:

private void Func2(ref Employee e)
{
    Employee e2 = new Employee { Name = "3" };
    e = e2;
}
Run Code Online (Sandbox Code Playgroud)

3正如您所料,上面会产生.


更新,关于您添加的Func1:

引用是一个副本,但仍然指向同一个对象 - 您正在更改此对象的状态(设置Name属性),而不是基础对象引用本身.