C#知識點(1)拆箱與封箱

C#數據類型

C#數據類型:值類型(Value types)、引用類型(Reference types)、指針類型(Pointer types)。

  1. 值類型(Value types)
    值類型變量可以直接分配給一個值,比如 int、char、float。
    內存存儲:值類型是保存在託管棧上的。
  2. 引用類型(Reference types)
    引用類型不包含存儲在變量中的實際數據,但它們包含對變量的引用。
    內置的引用類型有:object、dynamic 和 string。
    內存存儲:引用類型保存在託管堆上,但在託管棧上會生成一個指向這個堆的指針引用。
  3. 指針類型(Pointer types)
    指針類型變量存儲另一種類型的內存地址。

拆箱與封箱

簡單來說:

  • 封箱就是將值類型轉換爲引用類型。
  • 拆箱就是將引用類型轉換爲值類型。

本質上說:

  • 封箱是在值類型轉換爲引用類型對象時,將值類型字段拷貝到託管堆上發生的內存分配(與引用類型內存分配以及對數據操作是一模一樣的)。
  • 拆箱把託管堆上值類型數據傳遞到託管棧。

封箱舉例:

int i =666;
object obj = i;

在這裏插入圖片描述
拆箱舉例:

object obj = 666;
int j = (int)obj;

在這裏插入圖片描述
注意:

  • 封箱是針對值類型的。
  • 結構體也是值類型,而類是引用類型。
  • 對引用類型是沒有辦法封箱的,從封箱存儲角度來看,封箱的存儲方式和引用類型是一樣,如果把object obj = 引用類型A(引用類型A只包含一個int類型),實際上只是讓obj的指針引用等於A的指針引用。(內存存儲如下圖)
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章