国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

.NET的基元類型包括哪些?Unmanaged和Blittable類型又是什么?

這篇具有很好參考價值的文章主要介紹了.NET的基元類型包括哪些?Unmanaged和Blittable類型又是什么?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在討論.NET的類型系統(tǒng)的時候,我們經(jīng)常提到“基元類型(Primitive Type)”的概念,我發(fā)現(xià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,對應的字節(jié)數(shù)可能是1、2或者4,字符涉及不同的編碼(Unicode和ANSI),所以這兩種類型并非Blittable類型;
  • Blittable基元類型的一維數(shù)組;
  • 采用SequentialExplicitly布局的且只包含Blittable類型成員的結(jié)構(gòu)或者類,因為采用這兩種布局的對象最終會按照一種確定的格式轉(zhuǎn)換成對應的C風格的結(jié)構(gòu)體。如果采用Auto布局,CLR會按照少占用內(nèi)存的原則對字段成員重新排序,意味著其內(nèi)存結(jié)構(gòu)是不確定的。

順便強調(diào)一下,DateTime/DateTimeOffset都采用Auto布局(如下所示),Guid雖然是一個默認采用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類型,我們通過標注在類型上的StructLayoutAttribute將布局類型顯式設置成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類型。前者默認采用Auto布局,后者的Bar屬性并不是Blittable類型。如果將這樣Foobar對象作為參數(shù)按照上面的方式調(diào)用GCHandle. Alloc方法,會直接拋出ArgumentException異常,并提示“Object contains non-primitive or non-blittable data. (Parameter 'value')”。文章來源地址http://www.zghlxwxcb.cn/news/detail-479736.html

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; }
}

到了這里,關于.NET的基元類型包括哪些?Unmanaged和Blittable類型又是什么?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 什么是.NET?什么是.NET Core?以及什么是.NET Framework,.NET和.NET Core區(qū)別又是什么呢?

    什么是.NET?什么是.NET Core?以及什么是.NET Framework,.NET和.NET Core區(qū)別又是什么呢?

    概述 對于.NET平臺的初學者來說,有時候比較困惑“什么是.NET?什么是.NET Core?.NET和.NET Core區(qū)別又是什么呢?”。確實,目前微軟的開發(fā)平臺有兩種不同的.NET運行時環(huán)境,一種是.NET Framework,另一種則是.NET Core(.NET 5),不同的目標框架運行時環(huán)境不同。 那這兩者的區(qū)別到底是

    2024年02月06日
    瀏覽(93)
  • 搜索引擎優(yōu)化包括哪些內(nèi)容(優(yōu)化的內(nèi)容包括)

    搜索引擎優(yōu)化包括哪些內(nèi)容(優(yōu)化的內(nèi)容包括)

    搜索引擎優(yōu)化搜索引擎優(yōu)化的重要好處之一是它可以提供獨特的相關流量。依據(jù)搜索引擎優(yōu)化營銷推廣,可以幫助這種積極尋找你所提供的物件的人更很容易找到你。這促進研究變?yōu)樗阉饕鎯?yōu)化對策中的一個重要組成一部分,它呈現(xiàn)了指導思想顧客在尋找相關產(chǎn)品和

    2024年02月06日
    瀏覽(20)
  • 云安全包括哪些方面?

    云安全包括哪些方面?

    隨著云計算的快速發(fā)展,云安全問題也日益受到關注。云安全不僅涉及到個人數(shù)據(jù)安全,還涉及到國家安全、社會穩(wěn)定等方面。因此,了解云安全包括哪些方面對于保護個人隱私和企業(yè)數(shù)據(jù)安全具有重要意義。本文將從多個角度探討云安全所涉及的方面。 ?一、數(shù)據(jù)安全 數(shù)

    2024年01月23日
    瀏覽(21)
  • 網(wǎng)絡安全主要包括哪些方面

    網(wǎng)絡安全主要包括哪些方面

    什么是網(wǎng)絡安全?網(wǎng)絡安全主要包括哪些方面? 什么是網(wǎng)絡安全? 網(wǎng)絡安全就是網(wǎng)絡上的信息安全,是指網(wǎng)絡系統(tǒng)中的硬件、軟件和系統(tǒng)中的數(shù)據(jù)都能受到保護,不會因意外或惡意原因而損壞、更改或泄露。系統(tǒng)連續(xù)可靠地正常運行,網(wǎng)絡服務不中斷。 ? 從廣義上講,所有涉及

    2024年02月11日
    瀏覽(25)
  • 軟件開發(fā)技術包括哪些呢?

    軟件開發(fā)技術包括多種編程語言、開發(fā)框架、工具和方法,以滿足不同類型的應用和項目需求。以下是一些常見的軟件開發(fā)技術: 1、編程語言:各種編程語言用于開發(fā)不同類型的軟件,如Java、Python、C++、C#、JavaScript、Ruby、PHP、Swift、Kotlin等。 2、Web開發(fā)技術:用于創(chuàng)建網(wǎng)站

    2024年02月08日
    瀏覽(18)
  • 智能運維亂象有哪些?智能運維業(yè)務包括哪些

    智能運維亂象有哪些?智能運維業(yè)務包括哪些

    nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;在實施智能運維過程中可能遇到的亂象及其原因,系統(tǒng)地闡述智能運維業(yè)務所涵蓋的各個方面,包括但不限于預防性維護、故障檢測與診斷、自動化修復以及持續(xù)的性能優(yōu)化等關鍵組成部分。 實施智能運維過程中可能遇到的亂象及原因包括: 數(shù)

    2024年02月21日
    瀏覽(13)
  • 安全服務包括哪些內(nèi)容,安服工程師需要哪些技能

    安全服務包括哪些內(nèi)容,安服工程師需要哪些技能

    安全服務是一系列措施和程序,旨在保護組織和個人免受各種安全威脅。這些服務涵蓋了從網(wǎng)絡安全、數(shù)據(jù)保護、身份和訪問管理,到應用程序安全、安全監(jiān)控和響應、以及物理安全等多個方面。安全服務的目標是確保信息技術系統(tǒng)、數(shù)據(jù)以及物理環(huán)境的安全和完整性,同時

    2024年02月03日
    瀏覽(27)
  • 速動資產(chǎn)包括哪些(速動資產(chǎn)和流動資產(chǎn))

    速動資產(chǎn)包括哪些(速動資產(chǎn)和流動資產(chǎn))

    速動資產(chǎn)包括貨幣資金、交易性金融資產(chǎn)和各種應收款項等。速動資產(chǎn)指的是會計賬目上流動資產(chǎn)扣除存貨和待攤費用后的余額,主要包括貨幣資金、短期投資、應收票據(jù)、應收賬款等各項可迅速變現(xiàn)的資產(chǎn)。流動資產(chǎn)是指企業(yè)可以在一年或者超過一年的一個營業(yè)周期內(nèi)變現(xiàn)

    2024年02月09日
    瀏覽(19)
  • web安全主要包括哪些方面的安全

    web安全主要包括哪些方面的安全

    web安全主要包括哪些方面的安全:web安全主要分為保護服務器及其數(shù)據(jù)的安全、保護服務器和用戶之間傳遞的信息的安全、保護web應用客戶端及其環(huán)境安全這三個方面。 web安全介紹 Web應用安全問題本質(zhì)上源于軟件質(zhì)量問題。但Web應用相較傳統(tǒng)的軟件,具有其獨特性。 Web應用

    2024年02月06日
    瀏覽(16)
  • 水庫自動化監(jiān)測系統(tǒng)包括哪些內(nèi)容

    水庫自動化監(jiān)測系統(tǒng)包括哪些內(nèi)容

    隨著科技的不斷進步,水庫管理正逐步實現(xiàn)自動化和智能化。水庫自動化監(jiān)測系統(tǒng)是一種利用水位、流量、水溫及氣象等傳感器組成的水情自動監(jiān)測系統(tǒng),其在水庫大壩安全監(jiān)測領域發(fā)揮著重要作用,實現(xiàn)了對水庫實時水位、流量等數(shù)據(jù)的采集監(jiān)控,為水利工程安全提供了可

    2024年04月26日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包