C#中值類(lèi)型和引用類(lèi)型的區(qū)別

  1. 值類(lèi)型的數(shù)據(jù)存儲(chǔ)在內(nèi)存的棧中;引用類(lèi)型的數(shù)據(jù)存儲(chǔ)在內(nèi)存的堆中,而內(nèi)存單元中只存放堆中對(duì)象的地址。
  2. 值類(lèi)型存取速度快,引用類(lèi)型存取速度慢。
  3. 值類(lèi)型表示實(shí)際數(shù)據(jù),引用類(lèi)型表示指向存儲(chǔ)在內(nèi)存堆中的數(shù)據(jù)的指針或引用
  4. 值類(lèi)型繼承自System.ValueType,引用類(lèi)型繼承自System.Object
  5. 棧的內(nèi)存分配是自動(dòng)釋放;而堆在.NET中會(huì)有GC來(lái)釋放
  6. 值類(lèi)型的變量直接存放實(shí)際的數(shù)據(jù),而引用類(lèi)型的變量存放的則是數(shù)據(jù)的地址,即對(duì)象的引用。
  7. 值類(lèi)型變量直接把變量的值保存在堆棧中,引用類(lèi)型的變量把實(shí)際數(shù)據(jù)的地址保存在堆棧中,而實(shí)際數(shù)據(jù)則保存在堆中。注意,堆和堆棧是兩個(gè)不同的概念,在內(nèi)存中的存儲(chǔ)位置也不相同,堆一般用于存儲(chǔ)可變長(zhǎng)度的數(shù)據(jù),如字符串類(lèi)型;而堆棧則用于存儲(chǔ)固定長(zhǎng)度的數(shù)據(jù),如整型類(lèi)型的數(shù)據(jù)int(每個(gè)int變量占用四個(gè)字節(jié))。由數(shù)據(jù)存儲(chǔ)的位置可以得知,當(dāng)把一個(gè)值變量賦給另一個(gè)值變量時(shí),會(huì)在堆棧中保存兩個(gè)完全相同的值;而把一個(gè)引用變量賦給另一個(gè)引用變量,則會(huì)在堆棧中保存對(duì)同一個(gè)堆位置的兩個(gè)引用,即在堆棧中保存的是同一個(gè)堆的地址。在進(jìn)行數(shù)據(jù)操作時(shí),對(duì)于值類(lèi)型,由于每個(gè)變量都有自己的值,因此對(duì)一個(gè)變量的操作不會(huì)影響到其它變量;對(duì)于引用類(lèi)型的變量,對(duì)一個(gè)變量的數(shù)據(jù)進(jìn)行操作就是對(duì)這個(gè)變量在堆中的數(shù)據(jù)進(jìn)行操作,如果兩個(gè)引用類(lèi)型的變量引用同一個(gè)對(duì)象,實(shí)際含義就是它們?cè)诙褩V斜4娴亩训牡刂废嗤?,因此?duì)一個(gè)變量的操作就會(huì)影響到引用同一個(gè)對(duì)象的另一個(gè)變量。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容