我想知道为什么当我们 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)