gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:07:58 25 4
gpt4 key购买 nike

我想知道为什么当我们有 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); 在内存中创建了一个 new 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com