c# – 为什么构造函数不会影响此示例中的属性
发布时间:2020-12-15 20:51:33 所属栏目:百科 来源:网络整理
导读:我想知道为什么当我们有p = new Person(“TOM”,999);通过调用fred.PrintInfo(); 它不会将p改为TOM和999,而是使用p.age = 99;我们可以很好地改变fred的年龄,构造函数和属性都是公共的,那么我在这里缺少什么?我不想对这段代码做任何事我只想要原因. using Sy
我想知道为什么当我们有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 ---------+ 而新人(“TOM”,999);在内存中创建一个新的Person,并且p = …使p指向它: +------------+ fred ----> | Fred 99 | +------------+ +------------+ p ----> | TOM 999 | +------------+ 而这正是弗雷德仍然包含弗雷德,99的原因. 现在,如果你将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 | +------------+ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |