C# 對象與引用變量


從宏觀的角度來看,對象是類的實例。比如:

//定義一個名為Someone的類,代表這么一些人(通過指定年齡,性別,性格等基本信息)
class Someone  {
  public int age;
  public string sex;
  public string name;
  //other...
}

//......
//創建一個Someone類的對象,代表昵稱為nemo的一個特定的人
Someone nemo = new Someone();

這時,我們會象通常所說的那樣講到:我們創建了一個名為nemo的Someone類的對象(是的,這沒有錯,但它會和下文所講的一些內容產生些許理 解上的困惑)。因為每當創建類的一個實例(昵稱為nemo的某人),就創建該類的一個對象(名為nemo的Someone類的對象),而每個對象自身包含 類中定義的所有實例變量(age,sex,name等)的一個拷貝,所以說對象nemo是Someone類的實例。順便,我們再創建一個名為andy的 Someone類的對象:

Someone andy = new Someone();

對象nemo和對象andy是相同的嗎?他們僅僅是名字不同而已嗎?不——因為每個對象的變量的值不同!比如:

nemo ——>|age       20      |        andy ——> |age         40        |
               |sex        “男”   |                      |sex    “男”   |
               |name  “尼 莫”|                        |name  “劉德華”|

所以nemo和andy是兩個不同的對象,唯一相同的是它們都屬於同一種類型——Someone類!


而從微觀的角度來看,我們前面所說的“對象nemo”真的是對象嗎?你可能會奇怪我怎么會這么問...
實際上,
Someone nemo = new Someone();
這一創建一個Someone類的對象的過程分為兩步:

//聲明一個引用變量
Someone nemo;

//創建一個Someone類的對象,new運算符使運行時為該對象動態的分配內存;
//然后返回該對象所在的內存地址,並賦於變量nemo,從而引用變量nemo指向該對象
nemo = new Someone();

此時,對於nemo的理解應該是:nemo是一個引用新創建的Someone類對象的變量(如同c語言的指針變量),它本身並不是一個對象!

    引用變量nemo             對象所在內存地址(設運行時為其分配起始地址為100號的連續內存單元)  
    |          ——|————>100|     20     | age
                                       |    “男”  | sex
                                       | “尼 莫” | name


現 在你理解了為什么說類是引用類型了吧?——類對象通過引用來訪問呀!同時,也說明了為什么上文說“nemo和andy是兩個不同的對象”——運行時為對象 動態分配內存,所以兩個對象所在的內存地址不同,當然兩個對象是不同的咯!——等等,你剛剛不是說nemo是引用變量嗎?怎么又說“nemo... 是...對象”了呢?
筆者在初學時在理解上存在這樣的困惑!
但是,你可能注意到了,Someone是一個類,而nemo自然就是聲明為這個類的一個變量;而類作為一種類型,它是屬於引用類型,所以nemo自然就是一個引用類型的變量即引用變量了啊。
關鍵的一點是,我們可以從不同的角度來看這一問題:宏觀上,nemo是對象;而微觀上,深層的理解,nemo是引用變量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM