最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2023年06月12日 10:28:26   作者:Artech  
這篇文章主要介紹了.NET的基元類型包括什么及Unmanaged和Blittable類型詳解,Unmanaged類型可以理解不涉及托管對象引用的值類型,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下

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

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

一、Primitive Type

.NET下的基元類型(Primitive Type)如下14個。我們可以這樣來記:長度(字節(jié)數(shù))分別為1、2、4、8的有/無符號的整數(shù);外加兩個基于指針寬度(下x86=4; x64=8)的整數(shù),計10個。長度(字節(jié)數(shù))分別為4和8的單精度和雙精度浮點數(shù),計2個。外加布爾類型和字符類型, 計2個。所以我們熟悉的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)
  • 浮點(2):Float(float), Double(double)
  • 布爾(1):Boolean(bool)
  • 字符(1):Char(char)

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

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

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

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)體

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

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

三、Blittable Type

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

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

順便強調(diào)一下,DateTime/DateTimeOffset都采用Auto布局(如下所示),Guid雖然是一個默認(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類型的實例才能調(diào)用GCHandle的靜態(tài)方法Alloc為其創(chuàng)建一個Pinned類型的GC句柄。以如下的代碼為例,類Foobar的兩個屬性都是Blittable類型,我們通過標(biāo)注在類型上的StructLayoutAttribute將布局類型顯式設(shè)置成Sequential使其稱為了一個Blittable類型。

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

如果Foobar類定義成如下的形式,都不能使其稱為一個Blittable類型。前者默認(rèn)采用Auto布局,后者的Bar屬性并不是Blittable類型。如果將這樣Foobar對象作為參數(shù)按照上面的方式調(diào)用GCHandle. Alloc方法,會直接拋出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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于.net core微服務(wù)的另一種實現(xiàn)方法

    基于.net core微服務(wù)的另一種實現(xiàn)方法

    這篇文章主要給大家介紹了基于.net core微服務(wù)的另一種實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • ASP.NET Core中修改配置文件后自動加載新配置的方法詳解

    ASP.NET Core中修改配置文件后自動加載新配置的方法詳解

    這篇文章主要給大家介紹了關(guān)于ASP.NET Core中修改配置文件后自動加載新配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用ASP.NET Core具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • asp.net 仿騰訊微薄提示 還能輸入*個字符 的實現(xiàn)代碼

    asp.net 仿騰訊微薄提示 還能輸入*個字符 的實現(xiàn)代碼

    asp.net 仿騰訊微薄提示 還能輸入*個字符 的實現(xiàn)代碼,需要的朋友可以參考下。
    2011-10-10
  • MVC5 + EF6 + Bootstrap3 (11) 實現(xiàn)排序、搜索、分頁

    MVC5 + EF6 + Bootstrap3 (11) 實現(xiàn)排序、搜索、分頁

    本篇文章主要介紹了MVC5 + EF6 + Bootstrap3 (11) 實現(xiàn)排序、搜索、分頁,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考
    2016-12-12
  • 簡單幾步 實現(xiàn)vs2010對html5的支持

    簡單幾步 實現(xiàn)vs2010對html5的支持

    微軟從來不會讓程序員用記事本寫代碼,如今html5馬上就要火起來vs2010怎么會不支持html5呢?月月bird我將vs2010支持html5的方法整理了一下。
    2016-05-05
  • .NET Core如何獲取操作系統(tǒng)中的各種信息

    .NET Core如何獲取操作系統(tǒng)中的各種信息

    .net core是最近討論頻率很高的話題,下面這篇文章主要給大家介紹了關(guān)于利用.NET Core如何獲取操作系統(tǒng)中各種信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-05-05
  • gridview行索引獲取方法及實現(xiàn)代碼

    gridview行索引獲取方法及實現(xiàn)代碼

    GridView行索引的獲取有利于對GridView行數(shù)據(jù)進行操作(刪、改)等等,接下來介紹獲取方法,感興趣的朋友可以了解下,閱讀本文希望對你有幫助
    2013-01-01
  • Visual Stduio 2010開發(fā)環(huán)境搭建教程

    Visual Stduio 2010開發(fā)環(huán)境搭建教程

    這篇文章主要為大家詳細介紹了Visual Stduio 2010開發(fā)環(huán)境搭建教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 擴展 Entity Framework支持復(fù)雜的過濾條件(多個關(guān)鍵字模糊匹配)

    擴展 Entity Framework支持復(fù)雜的過濾條件(多個關(guān)鍵字模糊匹配)

    之前遇到一個棘手的Linq to EF查詢的技術(shù)問題,現(xiàn)有產(chǎn)品表Product,需要根據(jù)多個關(guān)鍵字模糊匹配產(chǎn)品名稱, 現(xiàn)將解決方案分享出來,按興趣的朋友可以參考下
    2012-12-12
  • c#委托與事件(詳解)

    c#委托與事件(詳解)

    本文中,我將通過兩個范例由淺入深地講述什么是委托、為什么要使用委托、事件的由來、.Net Framework中的委托和事件、委托和事件對Observer設(shè)計模式的意義,對它們的中間代碼也做了討論
    2012-12-12

最新評論

高雄市| 华容县| 伽师县| 莱阳市| 色达县| 高唐县| 南平市| 渑池县| 高碑店市| 鄯善县| 讷河市| 达州市| 肃宁县| 开封县| 长垣县| 德保县| 波密县| 抚顺市| 普陀区| 敦化市| 宜黄县| 临泉县| 会理县| 四川省| 六盘水市| 昌宁县| 横峰县| 巩义市| 余姚市| 洞头县| 资阳市| 广汉市| 方山县| 邵阳市| 民和| 麦盖提县| 赤城县| 株洲市| 布拖县| 南皮县| 西丰县|