中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中怎么實現裝箱與拆箱操作

發布時間:2021-06-16 14:47:43 來源:億速云 閱讀:246 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關C#中怎么實現裝箱與拆箱操作,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

疑問

都知道C#有裝箱和拆箱的操作,聽聞也都是講int類型轉換成object類型就是裝箱,將object類型再轉回int類型就是拆箱。

C#中怎么實現裝箱與拆箱操作

描述的通俗點:

  • 裝箱 將值類型轉換成引用類型,

  • 拆箱 將引用類型轉換成值類型。

  • 那看來是要先了解一下引用類型和值類型了。

引用類型和值類型

在C#中,所有稱之為"類(class)"的類型,都是引用類型,而值類型都是標注為結構(struct)或者枚舉(enum)。

下面就來看一看引用類型和值類型,在實例化的時候發生了什么操作(首先自然是申明一下兩種類型了):

C#中怎么實現裝箱與拆箱操作

實例化了一個引用類型(SomeRef)和一個值類型(SomeVal),在調用的時候看看會發生什么:

C#中怎么實現裝箱與拆箱操作

C#中怎么實現裝箱與拆箱操作

上述代碼執行完,可以看到在C#在操作引用類型的時候會執行以下幾步

  1.在托管堆上分配一塊內存;

  2.在分配的對象中,還需要加一些額外成員(類型對象指針,同步索引塊),這些成員必須初始化

  3.對象中的字段要初始化為0,(本例中在執行someRef.x = 5時,將字段x改為5)  

  4.在托管堆上分配一個對象時,可能會執行一次垃圾收集操作

看完引用類型,接下來看一下值類型:

C#中怎么實現裝箱與拆箱操作

C#中怎么實現裝箱與拆箱操作

可以看到相對于引用類型,值類型直觀的地方感覺就輕便了許多,

      1.在線程棧上分配一塊內存

  2.字段就在對象本身(沒有額外的成員,也不包含指向實例的指針)

  3.值類型實例不受垃圾回收期控制,減少了應用程序在生存周期內進行垃圾回收的次數

上面對值類型和引用類型做了個初步的解釋

下面來看看什么情況下會進行裝箱和拆箱

裝箱

現在假設我們需要將一組坐標點存到ArrayList集合中,以便后續的步驟使用,那么我們會像下面這樣:

1.定義一個表示坐標的值類型,里面分別有字段x(橫坐標),字段y(縱坐標)

C#中怎么實現裝箱與拆箱操作

2.將幾個點存入ArrayList集合中

 C#中怎么實現裝箱與拆箱操作

通過上例可以看到,通過調用ArrayList的Add方法,將Point坐標點添加到集合中

C#中怎么實現裝箱與拆箱操作

這是ArrayList的Add方法原型,可以看到他的接受參數是一個object類型

C#中怎么實現裝箱與拆箱操作

但是object類型是由"類(class)"來聲明的,前面說到聲明為"類(class)"的類型都是引用類型,但是我們的Point聲明為"結構(struct)"是一個值類型

可以看出,傳入的值類型會轉變為引用類型。

C#中為了讓一個值類型轉換成一個引用類型,需要進行一次裝箱操作,下面看一下裝箱操作具體會發生哪些事情:

  1.在托管堆上分配內存

  2.值類型的所有字段復制到新分配托管堆內存上

  3.返回對象的地址(這個地址是對一個對象的引用,值類型現在是一個引用類型)

注:舊的point對象不變,值類型轉換成引用類型的本質是重新建立了一個已裝箱的Point對象(引用類型)

拆箱

談完裝箱,再來談一談拆箱

在上述的坐標點集合對象中,想要獲取第一個點的信息

C#中怎么實現裝箱與拆箱操作

現在知道ArrayList存的都是對象的引用(或指針),那要做的就是獲取元素0中包含的引用(或指針),并將它放到Point對象的實例pFirst中

來看看拆箱的過程,完成了那些事情

  1.獲取已裝箱Point對象中的字段地址

  2.將這些字段的值從托管堆中復制聲明的Point對象實例pFirst中(pFirst是值類型,在線程棧中分配內存)

再說一句

目前在C#中,肯定不會再繼續用ArrayList來存儲一些對象的集合了,因為有了一組新的泛型集合,

例如用List<T>

C#中怎么實現裝箱與拆箱操作

在使用的就是就規定是什么類型,在存取數據的時候,不需要再進行多余的裝箱和拆箱操作

但是在寫代碼的時候還是會隱藏很多拆箱和裝箱的過程,注意盡量避免裝箱和拆箱的操作,如果不可避免,那就盡量減少裝箱和拆箱的操作,可以查看下方簡單示例(無實際意義):

C#中怎么實現裝箱與拆箱操作

上述就是小編為大家分享的C#中怎么實現裝箱與拆箱操作了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安龙县| 潜山县| 郁南县| 永新县| 松潘县| 喀喇| 呼图壁县| 潜山县| 新宁县| 林口县| 洪洞县| 页游| 贵定县| 建瓯市| 甘孜| 扬中市| 工布江达县| 武义县| 日喀则市| 虞城县| 同心县| 崇仁县| 乐山市| 商南县| 安达市| 华容县| 牟定县| 保山市| 民丰县| 开阳县| 合山市| 河源市| 泗阳县| 正定县| 阿合奇县| 河曲县| 张掖市| 商城县| 花莲县| 治多县| 宁海县|