我想知道为什么当我们通过调用 p = new Person("TOM", 999); 获得 fred.PrintInfo();它不会将 p 更改为 TOM 和 999,而是使用 p.age = 99;我们可以很好地改变 fred 的年龄,构造函数和属性都是公开的,那么我缺少什么?我不想对这段代码做任何事情,我只想知道原因。

using System;

class Person
{
    public string fullName;
    public int age;

    public Person(string n, int a)
    {
        fullName = n;
        age = a;
    }

    public void PrintInfo()
    {
        Console.WriteLine("{0} is {1} years old", fullName, age);
    }
}

class MainClass
{
    public static void SendAPersonByValue(Person p)
    {
        p.age = 99;

        p = new Person("TOM", 999);
    }

    public static void Main()
    {
        Person fred = new Person("Fred", 12);
        fred.PrintInfo();
        SendAPersonByValue(fred);
        fred.PrintInfo();
    }
}

最佳答案

fred 指向内存中的某个特定位置:

           +------------+
fred ----> | Fred    12 |
           +------------+

调用 SendAPersonByValue 后,p 指向同一位置:
           +------------+
fred ----> | Fred    12 |
           +------------+
              ^
  p  ---------+
p.age = 99; 现在更改内存中的值:
           +------------+
fred ----> | Fred    99 |
           +------------+
              ^
  p  ---------+

new Person("TOM", 999); 在内存中创建一个新的 Person ,而 p = ... 使 p 指向它:
           +------------+
fred ----> | Fred    99 |
           +------------+

           +------------+
  p  ----> | TOM    999 |
           +------------+

这正是 fred 仍然包含 Fred, 99 的原因。

现在,如果您将 fred 作为 ref parameter 传递, p 将成为 fred 的别名:
             +------------+
fred/p ----> | Fred    12 |
             +------------+

p.age = 99 之后:
             +------------+
fred/p ----> | Fred    99 |
             +------------+

p = new Person("TOM", 999); 之后:
             +------------+
             | Fred    99 |    (will be garbage collected eventually)
             +------------+

             +------------+
fred/p ----> | TOM    999 |
             +------------+

关于c# - 为什么构造函数不影响本例中的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9926804/

10-12 02:13