首页 新闻 会员 周边 捐助

关于c#中按值传递引用类型的问题

0
悬赏园豆:15 [已解决问题] 解决于 2012-04-05 15:42

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections;

namespace 控制台 {     class Program     {         static void Main(string[] args)         {             Person fred = new Person("Polly",22);             SendAPersonByValue(fred);             Person p;             p = new Person("Lucia",12);             p.Show();             fred.Show();             Console.ReadKey();         }         class Person         {             public string personName;             public int personAge;             public Person(string name, int age)             {                 personAge = age;                 personName = name;             }             public void Show()             {                 Console.WriteLine("Name:{0},Age:{1}", personName, personAge);             }         }         static void SendAPersonByValue(Person p)         {             p.personAge = 99;             p = new Person("Lucia",999);         }     } }

如上代码,为什么在Main函数中对p进行赋值,就可以赋值成功,而在SendAPersonByValue方法中对p进行new的赋值却没有效果?

C#
微澜的主页 微澜 | 初学一级 | 园豆:-1
提问于:2012-04-05 10:44
< >
分享
最佳答案
0

SendAPersonByValue方法中,p.personAge修改的是它指向的堆上的那个对象,它的执行结果跟你的想象中是一样的。但是p = new Person("Lucia",999) 只是把你当前参数p指向了堆上的一个新对象,对原先它指向的那个对象没有任何影响。

收获园豆:15
水牛刀刀 | 大侠五级 |园豆:6350 | 2012-04-05 11:06

拿这个例子来说,fred既然指向了堆上的一个新Person对象,那么为什么fred的值没有变成这个新的Person对象?我就是这个地方没有过弯来

微澜 | 园豆:-1 (初学一级) | 2012-04-05 12:36

@微澜:

SendAPersonByValue(fred); 
static void SendAPersonByValue(Person p);

我说的是p指向了堆上一个新的pserson对象,而不是fred,p是SendAPersonByValue的参数,跟fred不是一个东西。你把fred作为参数传进去的时候,会拷贝fred这个引用到p。所以p和fred只是指向同一个对象,但是他们是不同的引用。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-04-05 12:53

@微澜: 

excel画图的伤不起。将就着看。

水牛刀刀 | 园豆:6350 (大侠五级) | 2012-04-05 12:59
其他回答(2)
0

騷年,你好

首先你要搞清楚值類型和引用類型。--這個不多說了

然後你要搞清楚方法傳參傳的到底是什麽東西。

值類型的參數傳的是值的副本。引用類型傳的是引用的副本。

也就是說你上面的代碼裏面,雖然SendAPersonByValue方法中的參數P與Main方法中聲明的P指向同一個對象,但是他們的引用是不一樣的。

表達的不太好,看樓下怎麼說。

写代码的小2B | 园豆:4377 (老鸟四级) | 2012-04-05 11:10

繁体字威武。

支持(0) 反对(0) 水牛刀刀 | 园豆:6350 (大侠五级) | 2012-04-05 11:17

@水牛刀刀: 最近做一個項目,客戶是台灣的,所以你懂的。我很蛋疼。

支持(0) 反对(0) 写代码的小2B | 园豆:4377 (老鸟四级) | 2012-04-05 11:20
0

只要搞清楚按值传递与按引用传递的本质就好理解了。

按值传递:传递的是变量的一个副本。不管是值类型还是引用类型;

按引用传递:传递的是变量的内存地址。不管是值类型还是引用类型。

Jack Afa | 园豆:239 (菜鸟二级) | 2012-04-05 14:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册