C#裝箱(boxing)和拆箱(unboxing)

來源:互聯網
上載者:User

  學習過C#的程式員都知道,在C#中有值和引用兩種資料類型。但是這兩種類型具體有哪些區別呢?相信很多人都難以說明白。今天就來討論一下這個問題。

  一句話它們的區別就是在於複製機制的差異

  實值型別直接包含值,也就是變數引用的位置就是值在記憶體中實際儲存的位置。所以,如果將一個實值型別賦值給另一個實值型別,會在新變數的位置建立原始變數的值的一個記憶體副本。相同實值型別的第二個變數不能引用與第一個變數相同的記憶體位置(假定沒有out或ref參數)。所以,更改一個變數的值不會影響兩外一個的值。實值型別需要的記憶體量會在編譯時間固定下來,而且不會在運行時改變。因為大小是固定的,所以實值型別可以儲存在(stack)的記憶體地區中。

  參考型別儲存的是對一個記憶體位置的引用(記憶體位址),要去那個位置才能找到真正的資料。因此,為了訪問資料,"運行時"要從變數中讀取記憶體位置,然後跳轉到包含資料的記憶體位置。參考型別指向記憶體地區稱為(heap)。

  其實學習過彙編的朋友,很容易會聯想到CPU的定址方式中的直接定址儲存空間間接定址與上面兩種實值型別的引用方式很相同。雖然我沒有去求證,但我相信它們之間肯定會有一定的聯絡。

  由於兩種不同類型的存在,而且我們在實際開發中需要對這兩種類型進行轉換,所以我們有必要知道這其中的工作過程。這就是我們常說的裝箱拆箱裝箱,簡單的說就是將實值型別轉換為參考型別。拆箱,就是將參考型別轉換為實值型別。

  裝箱的過程:1、首先在堆中分配好記憶體。它將用於存放實值型別的資料以及一些必要的指標。2、將棧上的資料複製到堆上已指派好的位置。3、新對象引用得到更新,指向堆上的位置。

  拆箱時對堆上的資料進行解引用,大多數時候都會緊接在拆箱之後進行一次複製動作。

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.