Windows Phone 开发起步之旅之二 C#中的值类型和引用类型
今天和大家分享下本人也說不清楚的一個C#基礎(chǔ)知識,我說不清楚,所以我才想把它總結(jié)一下,以幫助我自己理解這個知識上的盲點(diǎn),順便也和同我一樣不是很清楚的人一起學(xué)習(xí)下。
?一說起來C#中的數(shù)據(jù)類型有哪些,大部分的人都知道值類型和引用類型,兩者的區(qū)別呢,我是說不全,下面先給出他們的定義吧,咱們再一一解釋那他們的區(qū)別。
?
1.兩種類型的介紹
1.值類型(value type)
1)定義
一種由類型的實際值表示的數(shù)據(jù)類型。如果向一個變量分配值類型,則該變量將被賦以全新的值副本。(這與引用類型不同,在引用類型中,賦值時不創(chuàng)建副本。)值類型通常創(chuàng)建在方法的棧幀上,而不是在垃圾回收堆中。可以對值類型進(jìn)行裝箱,這是一個創(chuàng)建相應(yīng)引用類型的過程。
C#中的值類型包括結(jié)構(gòu)類型和枚舉類型兩大類以及char、byte、long、int、float和double等簡單類型,值類型繼承自System.ValueType,值類型不能為空(null)。 值類型包括三大類型:簡單類型、結(jié)構(gòu)類型、枚舉類型。2)參考文章
http://msdn.microsoft.com/zh-cn/library/s1ax56ch.aspx2.引用類型(reference type)
1)定義
引用類型 由類型的實際值引用(類似于指針)表示的數(shù)據(jù)類型。如果為某個變量分配一個引用類型,則該變量將引用(或“指向”)原始值。不創(chuàng)建任何副本。引用類型包括類、接口、委托和裝箱值類型。2)參考文章
http://msdn.microsoft.com/zh-cn/library/490f96s2.aspx2.兩者的區(qū)別
?通過一個表格來對比下他們的區(qū)別
| ? | 值類型 | 引用類型 |
| 內(nèi)存分配地點(diǎn) | 分配在棧中 | 分配在堆中 |
| 效率 | 效率高,不需要地址轉(zhuǎn)換 | 效率低,需要進(jìn)行地址轉(zhuǎn)換 |
| 內(nèi)存回收 | 使用完后,立即回收 | 使用完后,不是立即回收,等待GC回收 |
| 賦值操作 | 進(jìn)行復(fù)制,創(chuàng)建一個同值新對象 | 只是對原有對象的引用 |
| 函數(shù)參數(shù)與返回值 | 是對象的復(fù)制 | 是原有對象的引用,并不產(chǎn)生新的對象 |
| 類型擴(kuò)展 | 不易擴(kuò)展 | 容易擴(kuò)展,方便與類型擴(kuò)展 |
?
補(bǔ)充說明:
1.值類型直接存儲其值,變量本身就包含了其實例數(shù)據(jù),而引用類型保存的只是實例數(shù)據(jù)的內(nèi)存引用。因此,一個值類型變量就永遠(yuǎn)不會影響到其他的值類型變量,而兩個引用類型變量則很有可能指向同一地址,從而發(fā)生相互影響。
2.從內(nèi)存分配上來看,值類型通常分配在線程的堆棧上,作用域結(jié)束時,所占空間自行釋放,效率高,無需進(jìn)行地址轉(zhuǎn)換,而引用類型通常分配在托管堆上,由GC來控制其回收,需要進(jìn)行地址轉(zhuǎn)換,效率降低,這也正是c#需要定義兩種數(shù)據(jù)類型的原因之一。
3.值類型均隱式派生自System.ValueType,而System.ValueType又直接派生于System.Object,每種值類型均有一個隱式的默認(rèn)構(gòu)造函數(shù)來初始化該類型的默認(rèn)值,注意所有的值類型都是密封(sealed)的,所以無法派生出新的值類型。而且System.ValueType本身是一個類類型,而不是值類型,因為它重寫了object的Equals()方法,所以對值類型將按照實例的值來比較,而不是比較引用地址。
4.C# 的統(tǒng)一類型系統(tǒng),使得值類型可以轉(zhuǎn)化為對象來處理,這就是常說的裝箱和拆箱。由于裝拆箱需要裝建全新對象或做強(qiáng)制類型轉(zhuǎn)換,這些操作所需時間和運(yùn)算要遠(yuǎn)遠(yuǎn)大于賦值操作,因此不提倡使用它,同時也要盡量避免隱式裝拆箱的發(fā)生。?
注:棧是操作系統(tǒng)分配的一個連續(xù)的內(nèi)存區(qū)域,用于快速訪問數(shù)據(jù)。因為值類型的容量是已知的,因此它可存儲在棧上。而托管堆是CLR在應(yīng)用程序啟動時為應(yīng)用程序預(yù)留的一塊連續(xù)內(nèi)存區(qū),是用于動態(tài)內(nèi)存分配的內(nèi)存區(qū),引用類型的容量只有到運(yùn)行時才能確定,所有用堆來存儲引用類型。
嵌套類型的內(nèi)存分配
對于引用類型嵌套值類型,以及值類型嵌套引用類型的情況下,內(nèi)存分配可以根據(jù)以下兩條規(guī)律來判斷:
???? 引用類型始終部署在托管堆上;
???? 值類型總是分配在它聲明的地方:作為字段時,跟隨其所屬的對象存儲;作為局部變量時,存儲在棧上。
?
誤區(qū)
“引用類型在堆上,值類型在棧上”
這個是用問題的,這個是部分正確的說法,問題出在值類型上,正如上面對“引用類型嵌套值類型”的說明中講的那樣,值類型作為字段時,跟隨其所屬的對象存儲,所以這個時候即便是值類型,也會被分配到堆上;只有局部變量和方法參數(shù)在棧上。
?
轉(zhuǎn)載于:https://www.cnblogs.com/kjiwu/p/3553697.html
總結(jié)
以上是生活随笔為你收集整理的Windows Phone 开发起步之旅之二 C#中的值类型和引用类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Target runtime Apach
- 下一篇: AChartEngine绘制图形