日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#--装箱和拆箱

發(fā)布時間:2025/3/21 C# 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#--装箱和拆箱 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們都知道C#有裝箱和拆箱的操作,裝箱是把基本類型用它們相應(yīng)的引用類型包裝起來,使其具有對象的性質(zhì);而拆箱則是將引用類型的對象簡化成值類型的數(shù)據(jù)。如:

int i=0; object o = (object)i; //裝箱 i=(int)o; //拆箱

轉(zhuǎn)換:

  裝箱?將值類型轉(zhuǎn)換成引用類型

  拆箱?將引用類型轉(zhuǎn)換成值類型

C#中,數(shù)據(jù)類型劃分為值類型和引用類型,與此對應(yīng),內(nèi)存分配被分成了兩種方式,一為棧,二為堆,注意:是托管堆。值類型只會在棧中分配,引用類型分配內(nèi)存與托管堆。(托管堆對應(yīng)于垃圾回收)

PS:o 和 i 的改變將互不影響,因為裝箱使用的是 i 的一個副本。

對值類型在堆中分配一個對象實例,并將該值復(fù)制到新的對象中。
1:首先從托管堆中為新生成的引用對象分配內(nèi)存。?
2:然后將值類型的數(shù)據(jù)拷貝到剛剛分配的內(nèi)存中。?
3:返回托管堆中新分配對象的地址,這個地址就是一個指向?qū)ο蟮囊昧恕?br /> 可以看出,進(jìn)行一次裝箱要進(jìn)行分配內(nèi)存和拷貝數(shù)據(jù)這兩項比較影響性能的操作。

PS:o 和 i 的改變將互不影響。

1、首先獲取托管堆中屬于值類型那部分字段的地址,這一步是嚴(yán)格意義上的拆箱。
2、將引用對象中的值拷貝到位于線程堆棧上的值類型實例中。
經(jīng)過這2步,可以認(rèn)為是同boxing是互反操作。嚴(yán)格意義上的拆箱,并不影響性能,但伴隨這之后的拷貝數(shù)據(jù)的操作就會同boxing操作中一樣影響性能。

對執(zhí)行效率的影響:

顯然,從原理上可以看出,裝箱時,生成的是全新的引用對象,這會有時間損耗,也就是造成效率降低。?那該如何做呢??
首先,應(yīng)該盡量避免裝箱。?比如上例的兩種情況,都可以避免,在第一種情況下,可以通過重載函數(shù)來避免。第二種情況,則可以通過泛型來避免。?當(dāng)然,凡事并不能絕對,假設(shè)你想改造的代碼為第三方程序集,你無法更改,那你只能是裝箱了。?對于裝箱/拆箱代碼的優(yōu)化,由于C#中對裝箱和拆箱都是隱式的,所以,根本的方法是對代碼進(jìn)行分析,而分析最直接的方式是了解原理結(jié)合查看反編譯的IL代碼。比如:在循環(huán)體中可能存在多余的裝箱,你可以簡單采用提前裝箱方式進(jìn)行優(yōu)化。

使用場景:

一般來說,裝箱操作主要用于這兩種場合:

1.賦值時使用:

在對Integer類型的變量直接賦值時會發(fā)生自動裝箱操作,將Integer對象賦值給int時會發(fā)生自動拆箱操作。當(dāng)賦值大于127時,Integer每賦值一次都會產(chǎn)生一個新的Integer對象。

2.調(diào)用方法,傳遞對象參數(shù)類型時:

比如我們不能直接在集合中放入基本類型值,因為集合只接收對象類型。我們可以將基本類型的值轉(zhuǎn)換成對象,然后將這些轉(zhuǎn)換的對象放入集合中。

再說一句:

目前在C#中,肯定不會再繼續(xù)用ArrayList來存儲一些對象的集合了,因為有了一組新的泛型集合,例如用List<T>:

List<int> listInt=new List<int>();//聲明一個int類型的泛型集合 listInt.Add(1);//添加一條數(shù)據(jù)

在使用的時候就規(guī)定是什么類型,在存取數(shù)據(jù)的時候,不需要再進(jìn)行多余的裝箱和拆箱操作。但是在寫代碼的時候還是會隱藏很多拆箱和裝箱的過程,注意盡量避免裝箱和拆箱的操作,如果不可避免,那就盡量減少裝箱和拆箱的操作,可以查看下方簡單示例(無實際意義):

ArrList arrayList =new ArrayList(); int number =1;//定義值類型arrayList.Add(number);//三次添加會造成三次裝箱 arrayList.Add(number); arrayList.Add(number);object o =number;//提前進(jìn)行一次裝箱操作 arrayList.Add(o);//三次添加并不會造成裝箱操作 arrayList.Add(o); arrayList.Add(o);

?

總結(jié)

以上是生活随笔為你收集整理的C#--装箱和拆箱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。