這篇文章主要講解了“C#基元類(lèi)型、值類(lèi)型、引用類(lèi)型是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“C#基元類(lèi)型、值類(lèi)型、引用類(lèi)型是什么”吧!
創(chuàng)新互聯(lián)建站專(zhuān)注為客戶(hù)提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、玉林網(wǎng)絡(luò)推廣、成都小程序開(kāi)發(fā)、玉林網(wǎng)絡(luò)營(yíng)銷(xiāo)、玉林企業(yè)策劃、玉林品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪(fǎng)、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供玉林建站搭建服務(wù),24小時(shí)服務(wù)熱線(xiàn):028-86922220,官方網(wǎng)址:www.cdcxhl.com
首先了解下什么是基元類(lèi)型,基元類(lèi)型是編譯器直接支持的數(shù)據(jù)類(lèi)型,像我們平時(shí)經(jīng)常用到的int string bool 都是基元類(lèi)型,基元類(lèi)型是映射到FCL中的類(lèi)型,像前面的三種類(lèi)型對(duì)應(yīng)到FCL中就是Int32 String Boolean,基元類(lèi)型只是給我們的編程提供了方便,它和FCL中的類(lèi)型在編譯后最終生成的IL完全相同。下面給出基元類(lèi)型和FCL類(lèi)型的對(duì)應(yīng)表
我們平時(shí)在寫(xiě)程序時(shí)通常都是使用基元類(lèi)型,因?yàn)榉奖悖緯?shū)的作者認(rèn)為應(yīng)該直接使用FCL中的類(lèi)型,原因如下:
C#基元類(lèi)型 | FCL類(lèi)型 | CLS相容 | 說(shuō)明 |
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類(lèi)型為System.Int64,但是在其他的語(yǔ)言中,如c++ 就將long視為一個(gè)Int32。這樣習(xí)慣于一種編程語(yǔ)言的人在看另一種編程語(yǔ)言寫(xiě)的源碼是就會(huì)產(chǎn)生錯(cuò)誤的理解。在FCL中的許多的方法將類(lèi)型名作為方法名的一部分,如System.Convert類(lèi)提供ToBoolean,ToInt32,ToSingle等。這樣在使用基元類(lèi)型做類(lèi)型轉(zhuǎn)換時(shí)就感覺(jué)有點(diǎn)怪怪的,如:float val=Convert.ToSingle(“23”);
CLR VIA C#教程之值類(lèi)型和引用類(lèi)型的區(qū)別
1.所有的值類(lèi)型都是從System.TypeValue派生,如Struct Enum都是值類(lèi)型;所有引用類(lèi)型都是從System.Object派生。
2.值類(lèi)型分配在線(xiàn)程堆棧上,引用類(lèi)型分配在托管堆上。
3.值類(lèi)型表現(xiàn)形式有未裝箱形式和已裝箱形式,而引用類(lèi)型總是已裝箱形式。
4.所有的值類(lèi)型都是sealed類(lèi)型,所以值類(lèi)型不能作為任何類(lèi)型的基類(lèi)型,也不能在值類(lèi)型中引入虛方法。
5.創(chuàng)建一個(gè)引用類(lèi)型變量時(shí),會(huì)被初始化為null,試圖使用一個(gè)null的引用類(lèi)型變量時(shí),會(huì)拋出NullReferenceException異常,也就是常見(jiàn)的“未將對(duì)象引用設(shè)置到對(duì)象的實(shí)例”;值類(lèi)型在創(chuàng)建時(shí)所有成員都初始化為0了,所以不會(huì)拋出該異常。
原文例子表示值類(lèi)型和引用類(lèi)型的區(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中類(lèi)型字段布局的控制
為了提高性能,clr能按照所選擇的任何方式來(lái)排列類(lèi)型的字段。我們可以通過(guò)在類(lèi)會(huì)是結(jié)構(gòu)上使用System.Runtime.InteropServices.StructLayoutAttribute屬性來(lái)改變這種排列的順序。該屬性接受一個(gè)LayoutKind的枚舉值(Auto,Sequential,Explicit),默認(rèn)情況下C#編譯器會(huì)為類(lèi)選擇Atuo,為結(jié)構(gòu)選擇Sequential。下面來(lái)定義一個(gè)類(lèi)和一個(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)在給類(lèi)和結(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)這樣的值類(lèi)型選擇Sequential,是因?yàn)橹殿?lèi)型會(huì)經(jīng)常和非托管代碼進(jìn)行交互,字段必須保持和開(kāi)發(fā)人員定義的一致。我們?cè)诰幋a過(guò)程中如果判斷所創(chuàng)建的值類(lèi)型不會(huì)與非托管代碼進(jìn)行交互,就可以像上面那樣給創(chuàng)建的值類(lèi)型添加[StructLayout(LayoutKind.Auto)] ,讓其進(jìn)行自動(dòng)排列,以提高性能。
感謝各位的閱讀,以上就是“C#基元類(lèi)型、值類(lèi)型、引用類(lèi)型是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)C#基元類(lèi)型、值類(lèi)型、引用類(lèi)型是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!