为什么构造函数不会影响此示例中的属性

Neg*_*cki 3 c#

我想知道为什么当我们 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Hei*_*nzi 20

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

           +------------+
fred ----> | Fred    12 |
           +------------+
Run Code Online (Sandbox Code Playgroud)

在调用SendAPersonByValue时,p指向同一位置:

           +------------+
fred ----> | Fred    12 |
           +------------+
              ^
  p  ---------+
Run Code Online (Sandbox Code Playgroud)

p.age = 99; 现在更改内存中的值:

           +------------+
fred ----> | Fred    99 |
           +------------+
              ^
  p  ---------+
Run Code Online (Sandbox Code Playgroud)

new Person("TOM", 999);创建一个的记忆的人,p = ...使得p指向它:

           +------------+
fred ----> | Fred    99 |
           +------------+

           +------------+
  p  ----> | TOM    999 |
           +------------+
Run Code Online (Sandbox Code Playgroud)

而这正是为什么fred仍然包含Fred, 99.


现在,如果你要传递fred一个ref参数,p将成为一个别名fred:

             +------------+
fred/p ----> | Fred    12 |
             +------------+
Run Code Online (Sandbox Code Playgroud)

之后p.age = 99:

             +------------+
fred/p ----> | Fred    99 |
             +------------+
Run Code Online (Sandbox Code Playgroud)

之后p = new Person("TOM", 999);:

             +------------+
             | Fred    99 |    (will be garbage collected eventually)
             +------------+

             +------------+
fred/p ----> | TOM    999 |
             +------------+
Run Code Online (Sandbox Code Playgroud)