我想知道为什么当我们通过调用 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/