C#中的實值型別與參考型別-譯自《Essential C# 4.0》

來源:互聯網
上載者:User

一、實值型別

  除去string外,所有的預定義基礎類型都是實值型別。實值型別直接包含值。換句話說,該變數指向記憶體中儲存(變數)值的同一地址。

正因為如此,當一個不同的變數被分配了相同的值,原始變數的值的記憶體副本改變到新的變數的地址。一個相同實值型別的第二個變數不能指向記憶體中的第一個變數相同的地址。因此,改變了第一個變數的值不會影響到第二個值。

  如:

  如,number1指向包含值42的記憶體中的特殊地址,將number1分配給number2後,這兩個變數都包含值42。然而,修改任何一個變數的值不影響另外一個。

  類似地,傳遞一個實值型別到一個方法(類如Console.WriteLine())會導致記憶體複製,方法中參數的任何改變不會影響調用函數範圍內的原始值。因為實值型別需要一個記憶體複製,通常它們應當被定義為小額記憶體開銷(小於16位元組)

二、參考型別

  參考型別和引用它們的變數指向資料存放區地址。參考型別儲存了資料存放區地址的引用,而不是直接儲存資料。因此,訪問資料時,運行時將讀取(引用變數的)記憶體位置,並跳到包含資料的記憶體位址。一個參考型別指向的資料記憶體地區是一個Heap(堆),如

  一個參考型別並不像實值型別那樣需要資料的相同的記憶體副本,後者效率更高但會導致一些問題。當把一個參考型別的變數值賦給另外一個參考型別變數時,僅有一次地址的記憶體複製發生,因此,參考型別需要的記憶體複本總是記憶體位址本身大小(32位處理器複製32bit,64位處理器複製64bit)。

  顯然,不複製資料將比實值型別的(複製)快一些,特別是後者的資料較龐大時。由於參考型別僅僅複製資料的地址,兩個不同的變數能指向相同的資料,通過一個變數改變資料將改變另一個變數。在賦值或方法調用時均如此。因此,一個方法會影響參考型別的資料並返回給調用者。由於這個原因,選擇定義一個變數為實值型別還是參考型別的決定性因素是該對象是否在邏輯上是一樣的大小不變的固定值,如果是,則實值型別。

  string,自訂的類屬於參考型別。

--邀月譯自《Essential C# 4.0》

附:

實值型別:基礎資料類型(整型、布爾型、字元型、實數型)、結構型、枚舉型。
參考型別:類、對象、string、數組、介面、委託。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.