我尝试执行以下代码,无法理解为什么行person.Name = "anton";
不起作用?该程序的输出是" colin"。
class Person
{
public string Name;
}
class MainClass
{
public static void MyMethod(Person person)
{
person.Name = "colin";
person = new Person();
person.Name = "anton";
}
public static void Main()
{
Person person = new Person();
person.Name = "felix";
MyMethod(person);
Console.WriteLine(person.Name);
}
}
答案 0 :(得分:2)
想想发生的事件序列:
Main
创建Person
Main
将对Person
的引用传递给MyMethod
MyMethod
对Main
Person
进行了修改。这是修改#1 MyMethod
从Main
替换对象的引用,并引用新的Person
对象。此时,Main
的{{1}}变量和person
的{{1}}参数引用了两个不同的对象。MyMethod
修改其person
对象(修改#2),然后返回MyMethod
的人在Person
调用Main
替换对象之前显示第一次修改的结果。如果您想允许MyMethod
内的new
重新分配,则需要通过引用传递变量。
答案 1 :(得分:2)
除非您在C#中指定ref
或out
关键字function parameters are passed by value,否则即使该类型是引用类型。
“按值传递”意味着创建原始变量的副本,对于引用类型,它表示引用的副本(不是实际对象,不复制对象,只是“指向“通过变量和参数”。
这意味着person
中的MyMethod
参数是person
方法中Main
变量的副本,因此为此参数分配新实例不会影响原始变量。
因此,更改函数中的实例的属性将影响原始实例,直到参数开始指向另一个对象(您在Person
内部实例化{{ {1}})。