国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

.NET的基元類型包括什么及Unmanaged和Blittable類型詳解

瀏覽:89日期:2022-06-14 14:25:59
目錄一、Primitive Type二、Unmanaged Type三、Blittable Type

在討論.NET的類型系統(tǒng)的時(shí)候,我們經(jīng)常提到“基元類型(Primitive Type)”的概念,我發(fā)現(xiàn)很多人并沒有真正理解基元類型就究竟包含哪些(比如很多人覺得字符串是基元類型)。除了明確界定基元類型外,本篇文章還會(huì)簡單介紹額外兩種關(guān)于類型的概念——Unmanaged類型和Blittable類型。

一、Primitive Type二、Unmanaged Type三、Blittable Type

一、Primitive Type

.NET下的基元類型(Primitive Type)如下14個(gè)。我們可以這樣來記:長度(字節(jié)數(shù))分別為1、2、4、8的有/無符號的整數(shù);外加兩個(gè)基于指針寬度(下x86=4; x64=8)的整數(shù),計(jì)10個(gè)。長度(字節(jié)數(shù))分別為4和8的單精度和雙精度浮點(diǎn)數(shù),計(jì)2個(gè)。外加布爾類型和字符類型, 計(jì)2個(gè)。所以我們熟悉的String(string)和Decimal(decimal)并不是基元類型。

整數(shù)(10):Byte(byte)/SByte(sbyte), Int16(short)/UInt16(ushort), Int32(int)/UInt32(uint), Int64(long)/UInt64(ulong), IntPtr(nint)/UIntPtr(nuint)浮點(diǎn)(2):Float(float), Double(double)布爾(1):Boolean(bool)字符(1):Char(char)

對于某個(gè)指定的Type對象,我們可以利用它的IsPrimitive屬性確定它是否為基元類型。

public abstract class Type{ public bool IsPrimitive { get; }}

Type對象的IsPrimitive屬性值最終來源于RuntimeTypeHandle類型如下這個(gè)內(nèi)部靜態(tài)方法IsPrimitive。從該方法的實(shí)現(xiàn)和CorElementType的枚舉成員也可以看出,枚舉值2-13,外加CorElementType.I(IntPtr)和CorElementType.U(UIntPtr)這14個(gè)類型屬于基元類型的范疇,這與上面的列表是一致的。

public struct RuntimeTypeHandle{ [SecuritySafeCritical] internal static bool IsPrimitive(RuntimeType type) {CorElementType corElementType = GetCorElementType(type);if (((int)corElementType < 2 || (int)corElementType > 13) && corElementType != CorElementType.I){ return corElementType == CorElementType.U;}return true; }}[Serializable]internal enum CorElementType : byte{ End = 0, Void = 1, Boolean = 2, Char = 3, I1 = 4, U1 = 5, I2 = 6, U2 = 7, I4 = 8, U4 = 9, I8 = 10, U8 = 11, R4 = 12, R8 = 13, String = 14, Ptr = 15, ByRef = 16, ValueType = 17, Class = 18, Var = 19, Array = 20, GenericInst = 21, TypedByRef = 22, I = 24, U = 25, FnPtr = 27, Object = 28, SzArray = 29, MVar = 30, CModReqd = 31, CModOpt = 32, Internal = 33, Max = 34, Modifier = 64, Sentinel = 65, Pinned = 69}二、Unmanaged Type

顧名思義,Unmanaged類型可以理解不涉及托管對象引用的值類型。如下的類型屬于Unmanaged 類型的范疇:

14種基元類型+Decimal(decimal)

枚舉類型

指針類型(比如int*, long*)

只包含Unmanaged類型字段的結(jié)構(gòu)體

如果要求泛型類型是一個(gè)Unmananged類型,我們可以按照如下的方式使用unmanaged泛型約束。我在《如何計(jì)算一個(gè)實(shí)例占用多少內(nèi)存?》提到過,只有Unmananged類型采用使用sizeof操作符計(jì)算大小。

public static unsafe int SizeOf<T>() where T : unmanaged{ return sizeof(T);}三、Blittable Type

Blittable是站在基于P/Invoke的互操作(InterOp)角度對傳遞的值是否需要進(jìn)行轉(zhuǎn)換(Marshaling)而作的分類。Blittable類型要求在托管內(nèi)存和非托管內(nèi)存具有完全一致的表示。如果某個(gè)參數(shù)為Blittable類型,在一個(gè)P/Invoke方法調(diào)用非托管方法的時(shí)候,該參數(shù)就無需要作任何的轉(zhuǎn)換。與之類似,如果調(diào)用方法的返回值是Blittable類型,在回到托管世界后也無需轉(zhuǎn)換。如下的類型屬于Blittable類型范疇:

除Boolean(bool)和Char(char)之外的12種基元類型,因?yàn)椴紶栔礣rue在不同的平臺(tái)可能會(huì)表示成1或者-1,對應(yīng)的字節(jié)數(shù)可能是1、2或者4,字符涉及不同的編碼(Unicode和ANSI),所以這兩種類型并非Blittable類型;Blittable基元類型的一維數(shù)組;采用Sequential和Explicitly布局的且只包含Blittable類型成員的結(jié)構(gòu)或者類,因?yàn)椴捎眠@兩種布局的對象最終會(huì)按照一種確定的格式轉(zhuǎn)換成對應(yīng)的C風(fēng)格的結(jié)構(gòu)體。如果采用Auto布局,CLR會(huì)按照少占用內(nèi)存的原則對字段成員重新排序,意味著其內(nèi)存結(jié)構(gòu)是不確定的。

順便強(qiáng)調(diào)一下,DateTime/DateTimeOffset都采用Auto布局(如下所示),Guid雖然是一個(gè)默認(rèn)采用Sequential布局的結(jié)構(gòu)體,但是最終映射在內(nèi)存種的字節(jié)依賴于字節(jié)序(Endianness),所以具有這三種類型字段的結(jié)構(gòu)體或者類都不是Blittable類型。

[Serializable][StructLayout(LayoutKind.Auto)]public struct DateTime{ }[Serializable][StructLayout(LayoutKind.Auto)]public struct DateTimeOffset{ }

只有Blittable類型的實(shí)例才能調(diào)用GCHandle的靜態(tài)方法Alloc為其創(chuàng)建一個(gè)Pinned類型的GC句柄。以如下的代碼為例,類Foobar的兩個(gè)屬性都是Blittable類型,我們通過標(biāo)注在類型上的StructLayoutAttribute將布局類型顯式設(shè)置成Sequential使其稱為了一個(gè)Blittable類型。

GCHandle.Alloc(new Foobar(), GCHandleType.Pinned);[StructLayout(LayoutKind.Sequential)]public class Foobar{ public int Foo { get; set; } public double Bar { get; set; }}

如果Foobar類定義成如下的形式,都不能使其稱為一個(gè)Blittable類型。前者默認(rèn)采用Auto布局,后者的Bar屬性并不是Blittable類型。如果將這樣Foobar對象作為參數(shù)按照上面的方式調(diào)用GCHandle. Alloc方法,會(huì)直接拋出ArgumentException異常,并提示“Object contains non-primitive or non-blittable data. (Parameter 'value')”。

public class Foobar{ public int Foo { get; set; } public double Bar { get; set; }}[StructLayout(LayoutKind.Sequential)]public class Foobar{ public int Foo { get; set; } public DateTime Bar { get; set; }}

到此這篇關(guān)于.NET的基元類型包括什么及Unmanaged和Blittable類型詳解的文章就介紹到這了,更多相關(guān).NET的基元類型內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: ASP.NET
主站蜘蛛池模板: 女人张开腿让男人捅视频 | 久久免费精品国产视频 | 亚洲精品一区二区三区不卡 | 色噜噜国产精品视频一区二区 | 久久香蕉国产观看猫咪3atv | 日韩一区二区精品久久高清 | 免费国产高清精品一区在线 | 久草在线视频在线观看 | 久久福利国产 | 国产午夜精品久久久久免费视 | 日本成本人片 | 色欧美在线 | 欧美一级片在线视频 | 久久国产一区二区 | 草草草在线观看 | 成人黄色免费看 | 亚洲国产精品日韩在线 | 精品一区二区三区亚洲 | 一级黄色毛片免费看 | 亚洲一区欧洲一区 | 久久综合成人网 | 无码孕妇孕交在线观看 | 日韩欧美一区二区三区免费看 | 美女视频免费永久观看的 | 久久黄色免费网站 | 日本精品一区二区三区在线 | 亚洲欧美国产中文 | 中文字幕一区二区三区有限公司 | 一级视频在线免费观看 | 99国产精品农村一级毛片 | 一区二区三区免费在线视频 | 一级a毛片免费观看 | 国产精自产拍久久久久久蜜 | 京东一热本色道久久爱 | 国产手机精品一区二区 | 国产视频a区| 亚洲视频观看 | 八戒午夜精品视频在线观看 | 成人欧美网站 | 欧美黄色免费网站 | 亚洲aa|