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的赋值却没有效果?
SendAPersonByValue方法中,p.personAge修改的是它指向的堆上的那个对象,它的执行结果跟你的想象中是一样的。但是p = new Person("Lucia",999) 只是把你当前参数p指向了堆上的一个新对象,对原先它指向的那个对象没有任何影响。
拿这个例子来说,fred既然指向了堆上的一个新Person对象,那么为什么fred的值没有变成这个新的Person对象?我就是这个地方没有过弯来
@微澜:
SendAPersonByValue(fred);
static void SendAPersonByValue(Person p);
我说的是p指向了堆上一个新的pserson对象,而不是fred,p是SendAPersonByValue的参数,跟fred不是一个东西。你把fred作为参数传进去的时候,会拷贝fred这个引用到p。所以p和fred只是指向同一个对象,但是他们是不同的引用。
@微澜:
excel画图的伤不起。将就着看。
騷年,你好
首先你要搞清楚值類型和引用類型。--這個不多說了
然後你要搞清楚方法傳參傳的到底是什麽東西。
值類型的參數傳的是值的副本。引用類型傳的是引用的副本。
也就是說你上面的代碼裏面,雖然SendAPersonByValue方法中的參數P與Main方法中聲明的P指向同一個對象,但是他們的引用是不一樣的。
表達的不太好,看樓下怎麼說。
繁体字威武。
@水牛刀刀: 最近做一個項目,客戶是台灣的,所以你懂的。我很蛋疼。
只要搞清楚按值传递与按引用传递的本质就好理解了。
按值传递:传递的是变量的一个副本。不管是值类型还是引用类型;
按引用传递:传递的是变量的内存地址。不管是值类型还是引用类型。