下面解释程序的输出
本文关键字:输出 解释程序 | 更新日期: 2023-09-27 18:33:55
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"作为答案?
以下是让您了解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
属性),而不是基础对象引用本身。
当你调用 Func2
时,它会按值传递引用。赋值给方法内部的e
不会改变存储在emp
中的值,它只是给局部变量e
赋值一个不同的值。
如果要按引用传递,请使用 ref
关键字。
Func2(ref emp);
private void Func2(ref Employee e)
{
// etc...
}
在func2
中,您将创建一个新的员工实例并为其分配一个值。与func1
一样,您只是修改已创建的实例,因此更改会反射回来。