无法使用`new`关键字修改函数中的对象

时间:2017-08-24 18:32:06

标签: c# .net windows

我尝试执行以下代码,无法理解为什么行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);
    }
}

2 个答案:

答案 0 :(得分:2)

想想发生的事件序列:

  • Main创建Person
  • Main将对Person的引用传递给MyMethod
  • MyMethodMain Person进行了修改。这是修改#1
  • MyMethod Main替换对象的引用,并引用新的Person对象。此时,Main的{​​{1}}变量和person的{​​{1}}参数引用了两个不同的对象。
  • MyMethod修改其person对象(修改#2),然后返回
  • MyMethod的人在Person调用Main替换对象之前显示第一次修改的结果。

如果您想允许MyMethod内的new重新分配,则需要通过引用传递变量。

答案 1 :(得分:2)

除非您在C#中指定refout关键字function parameters are passed by value,否则即使该类型是引用类型。

“按值传递”意味着创建原始变量的副本,对于引用类型,它表示引用的副本(不是实际对象,不复制对象,只是“指向“通过变量和参数”。

这意味着person中的MyMethod参数是person方法中Main变量的副本,因此为此参数分配新实例不会影响原始变量。

因此,更改函数中的实例的属性将影响原始实例,直到参数开始指向另一个对象(您在Person内部实例化{{ {1}})。