這篇文章主要講解了“C#基元類型、值類型、引用類型是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C#基元類型、值類型、引用類型是什么”吧!
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、玉林網(wǎng)絡(luò)推廣、成都小程序開發(fā)、玉林網(wǎng)絡(luò)營(yíng)銷、玉林企業(yè)策劃、玉林品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供玉林建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:www.chinadenli.net
首先了解下什么是基元類型,基元類型是編譯器直接支持的數(shù)據(jù)類型,像我們平時(shí)經(jīng)常用到的int string bool 都是基元類型,基元類型是映射到FCL中的類型,像前面的三種類型對(duì)應(yīng)到FCL中就是Int32 String Boolean,基元類型只是給我們的編程提供了方便,它和FCL中的類型在編譯后最終生成的IL完全相同。下面給出基元類型和FCL類型的對(duì)應(yīng)表
我們平時(shí)在寫程序時(shí)通常都是使用基元類型,因?yàn)榉奖悖緯淖髡哒J(rèn)為應(yīng)該直接使用FCL中的類型,原因如下:
C#基元類型 | FCL類型 | CLS相容 | 說明 |
sbyte | System.Sbyte | ||
byte | System.Byte | ||
short | System.Int16 | ||
ushort | System.UInt16 | ||
int | System.Int32 | ||
uint | System.Uint32 | ||
long | System.Int64 | ||
ulong | System.Uint64 | ||
char | System.Char | ||
float | System.Single | ||
double | System.Double | ||
bool | System.Boolean | ||
decimal | System.Decimal | ||
object | System.Object | ||
string | System.String |
在c#中l(wèi)ong對(duì)應(yīng)的FCL類型為System.Int64,但是在其他的語言中,如c++ 就將long視為一個(gè)Int32。這樣習(xí)慣于一種編程語言的人在看另一種編程語言寫的源碼是就會(huì)產(chǎn)生錯(cuò)誤的理解。在FCL中的許多的方法將類型名作為方法名的一部分,如System.Convert類提供ToBoolean,ToInt32,ToSingle等。這樣在使用基元類型做類型轉(zhuǎn)換時(shí)就感覺有點(diǎn)怪怪的,如:float val=Convert.ToSingle(“23”);
CLR VIA C#教程之值類型和引用類型的區(qū)別
1.所有的值類型都是從System.TypeValue派生,如Struct Enum都是值類型;所有引用類型都是從System.Object派生。
2.值類型分配在線程堆棧上,引用類型分配在托管堆上。
3.值類型表現(xiàn)形式有未裝箱形式和已裝箱形式,而引用類型總是已裝箱形式。
4.所有的值類型都是sealed類型,所以值類型不能作為任何類型的基類型,也不能在值類型中引入虛方法。
5.創(chuàng)建一個(gè)引用類型變量時(shí),會(huì)被初始化為null,試圖使用一個(gè)null的引用類型變量時(shí),會(huì)拋出NullReferenceException異常,也就是常見的“未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例”;值類型在創(chuàng)建時(shí)所有成員都初始化為0了,所以不會(huì)拋出該異常。
原文例子表示值類型和引用類型的區(qū)別
class Program { static void Main(string[] args) { SomeRef r1 = new SomeRef(); SomeVal v1 = new SomeVal(); r1.x = 5; v1.x = 5; Console.WriteLine(r1.x); //5 Console.WriteLine(v1.x); //5 SomeRef r2 = r1; SomeVal v2 = v1; r1.x = 8; v1.x = 9; Console.WriteLine(r1.x); //8 Console.WriteLine(r2.x); //9 Console.WriteLine(v1.x); //9 Console.WriteLine(v2.x); //5 } } class SomeRef { public Int32 x; } struct SomeVal { public Int32 x; }
CLR VIA C#教程之CLR中類型字段布局的控制
為了提高性能,clr能按照所選擇的任何方式來排列類型的字段。我們可以通過在類會(huì)是結(jié)構(gòu)上使用System.Runtime.InteropServices.StructLayoutAttribute屬性來改變這種排列的順序。該屬性接受一個(gè)LayoutKind的枚舉值(Auto,Sequential,Explicit),默認(rèn)情況下C#編譯器會(huì)為類選擇Atuo,為結(jié)構(gòu)選擇Sequential。下面來定義一個(gè)類和一個(gè)結(jié)構(gòu)
struct SomeVal { public String name; public Int32 id; } class SomeRel { public String name; public Int32 id; }查看IL代碼可以看到默認(rèn)的排列順序

現(xiàn)在給類和結(jié)構(gòu)加上屬性,首引用加命名空間 using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Auto)] struct SomeVal { public String name; public Int32 id; } [StructLayout(LayoutKind.Sequential)] class SomeRel { public String name; public Int32 id; }再查看IL可以看到順序已經(jīng)發(fā)生了變化

C#編譯器總是會(huì)默認(rèn)給結(jié)構(gòu)這樣的值類型選擇Sequential,是因?yàn)橹殿愋蜁?huì)經(jīng)常和非托管代碼進(jìn)行交互,字段必須保持和開發(fā)人員定義的一致。我們?cè)诰幋a過程中如果判斷所創(chuàng)建的值類型不會(huì)與非托管代碼進(jìn)行交互,就可以像上面那樣給創(chuàng)建的值類型添加[StructLayout(LayoutKind.Auto)] ,讓其進(jìn)行自動(dòng)排列,以提高性能。
感謝各位的閱讀,以上就是“C#基元類型、值類型、引用類型是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)C#基元類型、值類型、引用類型是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
分享名稱:C#基元類型、值類型、引用類型是什么
網(wǎng)頁地址:http://www.chinadenli.net/article40/peehho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、建站公司、營(yíng)銷型網(wǎng)站建設(shè)、定制網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)