淺談C#中的值類型和引用類型
一、基本概念
C#只有兩種數(shù)據(jù)類型:值類型和引用類型
值類型在線程棧分配空間,引用類型在托管堆分配空間
值類型轉(zhuǎn)為引用類型稱成為裝箱,引用類型轉(zhuǎn)為值類型稱為拆箱
以下是值類型和引用類型對(duì)照表
從上圖可以簡(jiǎn)單看出:string,Object,數(shù)組,class是引用類型,簡(jiǎn)單類型,枚舉,結(jié)構(gòu)是值類型。
二、代碼展示
定義一個(gè)類和結(jié)構(gòu)調(diào)用賦值
內(nèi)存分配情況如下圖:
從這張圖可以看出,class實(shí)例化出來(lái)的對(duì)象,指向了內(nèi)存堆中分配的空間;truct實(shí)例化出來(lái)的對(duì)象,是在內(nèi)存棧中分配。
修改代碼如下:
內(nèi)存分配情況:
由上圖可以知:
object obj=”abc”;
string i=(string)obj;
值類型和引用類型儲(chǔ)的位置不一樣
如果是引用類型,當(dāng)兩個(gè)對(duì)象指向同一個(gè)地方,修改某一個(gè)的時(shí)候,其它對(duì)象的值會(huì)發(fā)生改變
using System; namespace ConsoleApplication2 { //引用類型(因?yàn)椤甤lass') public class SomeRef { public int x { get; set; } } //值類型(因?yàn)椤畇truct') public struct SomeVal { public int x{ get; set; } } class Program { static void Main(string[] args) { SomeRef r1=new SomeRef(); //在堆上分配 SomeVal v1 = new SomeVal();//在棧上分配 r1.x = 5; //提領(lǐng)指針 v1.x = 5; //在棧上修改 Console.WriteLine(r1.x); //顯示5 Console.WriteLine(v1.x); //顯示5 SomeRef r2 =r1; //只復(fù)制引用(指針) SomeVal v2 =v1; //在棧上分配并賦值成員 r1.x = 8; //r1.x和r2.x都會(huì)修改 v1.x = 8; //v1.x會(huì)更改,v2.x不會(huì) Console.WriteLine(r1.x); //顯示8 Console.WriteLine(r2.x); //顯示8 Console.WriteLine(v1.x); //顯示8 Console.WriteLine(v2.x); //顯示5 Console.ReadKey(); } } }
三、值類型裝箱、拆箱
1、裝箱:就是將值類型的數(shù)據(jù)打包到引用類型的實(shí)例中(比如將string類型的值abc賦給object對(duì)象obj)
object obj=(object)i;
裝箱時(shí)到底發(fā)生的事情:
1)、在托管堆中分配內(nèi)存。分配的內(nèi)存量是值類型各字段所需的內(nèi)存量,還要加上托管堆所有對(duì)象都有的兩個(gè)額外成員(類型對(duì)象指針和同步塊索引)所需的內(nèi)存量
2)、值類型的字段復(fù)制到新分配的堆內(nèi)存
3)、返回對(duì)象地址,現(xiàn)在該地址是對(duì)象引用;值類型成了引用類型
2、拆箱:就是從引用數(shù)據(jù)中提取值類型(比如將object對(duì)象obj的值賦給string類型的變量i)
string i=(string)obj;
拆箱不是裝箱過(guò)程倒過(guò)來(lái),拆箱的代價(jià)愛(ài)比裝箱低的多,拆箱是獲取指針的過(guò)程,該指針指向包含在一個(gè)對(duì)象中的原始值類型。
拆箱后將堆中的字段包含的值復(fù)制棧的值類型實(shí)例中。
3、值類型變?yōu)橐妙愋筒灰欢ㄒb箱,例如:
string str1 = "joye.net" + 26.ToString(); //tostring后不需要裝箱
感興趣的可以用IL看一下。
上一篇:C#遞歸算法之快速排序
欄 目:C#教程
下一篇:C#遞歸算法之分而治之策略
本文標(biāo)題:淺談C#中的值類型和引用類型
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6426.html
您可能感興趣的文章
- 01-10C#中查找Dictionary中的重復(fù)值的方法
- 01-10C#獲取動(dòng)態(tài)生成的CheckBox值
- 01-10C#簡(jiǎn)單實(shí)現(xiàn)子窗體向父窗體傳值的方法
- 01-10C#將圖片存放到SQL SERVER數(shù)據(jù)庫(kù)中的方法
- 01-10關(guān)于nancy中的身份驗(yàn)證
- 01-10C#中的事務(wù)用法實(shí)例分析
- 01-10C#實(shí)現(xiàn)讀取DataSet數(shù)據(jù)并顯示在ListView控件中的方法
- 01-10C#中的正則表達(dá)式介紹
- 01-10C#開(kāi)發(fā)中的垃圾回收機(jī)制簡(jiǎn)析
- 01-10C#語(yǔ)言中的修飾符匯總


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery