成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

CLR VIA C#教程之基元類型 值類型 引用類型介紹

開發(fā) 后端
CLR Via C#教程基元類型 值類型 引用類型介紹,對原文例子表示值類型和引用類型的區(qū)別進(jìn)行代碼分析,CLR中類型字段布局的控制。

我很喜歡《CLR Via C#》這本書,但一直都沒能深入理解,而且很多內(nèi)容也忘記了,現(xiàn)在準(zhǔn)備重新看一遍,并將看過的部分寫出來,因?yàn)閷懙倪^程也是一個(gè)加深理解的過程。本系列算是學(xué)習(xí)的一個(gè)記錄吧,也可以方便以后自己查閱,如果對大家還有些幫助的話,我就很高興了。書我是選擇性的看的,所以順序和書中的順序可能不一樣。

首先了解下什么是基元類型,基元類型是編譯器直接支持的數(shù)據(jù)類型,像我們平時(shí)經(jīng)常用到的int string bool 都是基元類型,基元類型是映射到FCL中的類型,像前面的三種類型對應(yīng)到FCL中就是Int32 String Boolean,基元類型只是給我們的編程提供了方便,它和FCL中的類型在編譯后最終生成的IL完全相同。下面給出基元類型和FCL類型的對應(yīng)表
我們平時(shí)在寫程序時(shí)通常都是使用基元類型,因?yàn)榉奖?,但本書的作者認(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對應(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異常,也就是常見的“未將對象引用設(shè)置到對象的實(shí)例”;值類型在創(chuàng)建時(shí)所有成員都初始化為0了,所以不會(huì)拋出該異常。

原文例子表示值類型和引用類型的區(qū)別

  1. class Program  
  2. {  
  3. static void Main(string[] args)  
  4. {  
  5. SomeRef r1 = new SomeRef();  
  6. SomeVal v1 = new SomeVal();  
  7. r1.x = 5;  
  8. v1.x = 5;  
  9. Console.WriteLine(r1.x);    //5  
  10. Console.WriteLine(v1.x);    //5  
  11. SomeRef r2 = r1;  
  12. SomeVal v2 = v1;  
  13. r1.x = 8;  
  14. v1.x = 9;  
  15. Console.WriteLine(r1.x);    //8  
  16. Console.WriteLine(r2.x);    //9  
  17. Console.WriteLine(v1.x);    //9  
  18. Console.WriteLine(v2.x);    //5  
  19. }  
  20. }  
  21. class SomeRef  
  22. {  
  23. public Int32 x;  
  24. }  
  25. struct SomeVal  
  26. {  
  27. 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)

  1. struct SomeVal  
  2. {  
  3. public String name;  
  4. public Int32 id;  
  5.  
  6. }  
  7.  
  8. class SomeRel  
  9. {  
  10. public String name;  
  11. public Int32 id;  
  12. }  

查看IL代碼可以看到默認(rèn)的排列順序

默認(rèn)的排列順序 

現(xiàn)在給類和結(jié)構(gòu)加上屬性,首引用加命名空間 using System.Runtime.InteropServices;

  1. [StructLayout(LayoutKind.Auto)]  
  2. struct SomeVal  
  3. {  
  4. public String name;  
  5. public Int32 id;  
  6. }  
  7. [StructLayout(LayoutKind.Sequential)]  
  8. class SomeRel  
  9. {  
  10. public String name;  
  11. public Int32 id;  

再查看IL可以看到順序已經(jīng)發(fā)生了變化

    順序變化頁面 

 

 C#編譯器總是會(huì)默認(rèn)給結(jié)構(gòu)這樣的值類型選擇Sequential,是因?yàn)橹殿愋蜁?huì)經(jīng)常和非托管代碼進(jìn)行交互,字段必須保持和開發(fā)人員定義的一致。我們在編碼過程中如果判斷所創(chuàng)建的值類型不會(huì)與非托管代碼進(jìn)行交互,就可以像上面那樣給創(chuàng)建的值類型添加[StructLayout(LayoutKind.Auto)] ,讓其進(jìn)行自動(dòng)排列,以提高性能。

查看IL代碼可以看到默認(rèn)的排列順序,以上是CLR VIA C#教程系列之一。

【編輯推薦】

  1. 全面解析CLR是什么一點(diǎn)通
  2. 為你解疑C++ CLR和ISO C++原理區(qū)別
  3. 趣談CLR中的靜態(tài)構(gòu)造函數(shù)
  4. CLR VB.NET學(xué)習(xí)經(jīng)驗(yàn)
  5. 深入解析.Net CLR函數(shù)使用舉例
責(zé)任編輯:田樹 來源: 博客
相關(guān)推薦

2009-08-19 16:39:44

C#值類型C#引用類型

2009-08-26 14:05:19

C#值類型和引用類型

2009-08-03 17:51:43

C#引用類型

2011-06-08 13:03:52

C#值類型引用類型

2009-10-22 19:11:25

CLR Via C#教

2009-08-03 14:54:23

值類型C#

2013-05-23 17:21:16

C#

2009-08-31 14:34:46

C#值類型C#結(jié)構(gòu)類型

2009-08-14 17:09:48

C#引用類型

2009-08-27 16:39:26

C# String類型

2009-09-03 16:55:58

C#引用類型

2009-08-06 10:14:15

C#引用類型數(shù)組

2009-09-11 11:09:36

C#引用類型

2009-09-11 11:17:04

C#引用類型

2009-08-14 17:04:50

C#類型系統(tǒng)

2009-08-27 10:19:22

C#匿名類型

2009-08-18 17:17:05

C#局部類型

2009-10-10 09:53:07

.NET值類型

2009-09-18 09:02:45

CLR Via C#

2009-09-07 10:48:53

C#數(shù)據(jù)類型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品www久久久久久广东 | 涩涩视频网站在线观看 | 极品销魂美女一区二区 | 精品亚洲一区二区 | 亚洲成人黄色 | 成人在线精品视频 | 成人福利网站 | 国产精品爱久久久久久久 | 国产精品久久久久久久岛一牛影视 | 欧美夜夜| 天堂网中文字幕在线观看 | 毛片视频免费 | av在线一区二区三区 | 999精彩视频 | 国产一区二区自拍 | 国产精品视频免费观看 | 日韩视频在线一区二区 | 欧美精品区 | 亚洲精品成人在线 | 成人在线中文字幕 | 婷婷久久精品一区二区 | 免费视频一区二区三区在线观看 | 久久久精品影院 | 91精品国产欧美一区二区 | 免费在线观看av片 | av男人的天堂在线 | 久久一级免费视频 | 久热国产在线 | 国产亚洲精品综合一区 | 国产一二三区在线 | 五月天天丁香婷婷在线中 | 六月成人网 | 欧美大片一区 | 91免费视频观看 | 免费在线h视频 | 伊人超碰 | 2018中文字幕第一页 | 五月综合久久 | 欧美成人激情 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 欧美日韩在线视频一区二区 |