.Net裏的方法是不能獨立存在的,調用方法必須使用類或者對象做爲主調用者。若是聲明方法包含了形參聲明,調用方法必須給這些形參指定參數值,調用方法時實際傳遞給形參的參數值被稱爲實參。
當引用類型做爲參數傳遞到方法中是如何傳遞的呢?下面先看一下源碼吧,猜猜輸出的結果是什麼?
namespace Test { class Program { static void Main(string[] args) { Person person = new Person(); SetPerson(person); Console.WriteLine("UserName={0},Age={1}", person.UserName, person.Age); Console.ReadKey(); } static void SetPerson(Person person) { person.UserName = "kangye"; person.Age = 25; person = null; } } class Person { /// <summary> /// userName字段 /// </summary> private string userName; /// <summary> /// UserName屬性 /// </summary> public string UserName { get { return userName; } set { userName = value; } } /// <summary> /// age字段 /// </summary> private int age; /// <summary> /// Age屬性 /// </summary> public int Age { get { return age; } set { age = value; } } } }
輸出結果:UserName=kangye,Age=25 你猜到了嗎?好多朋友會迷惑,我明明給SetPerson方法中的person賦值爲null了,爲何還有值呢。
其實在傳遞的時候,實參複製了一份引用地址給了形參,在SetPerson棧區中person也是指向堆內存中的Person對象,當給Person屬性賦值以後,將SetPerson的person賦值爲null,null是不知道的意思,SetPerson棧區的person不在指向堆內存的Person對象,可是堆內存中的對象是存在的,由於main棧區的person指向該對象