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

C#使用StructLayout特性來控制內(nèi)存結(jié)構(gòu)的操作代碼

 更新時間:2024年10月15日 09:05:36   作者:△曉風(fēng)殘月〆  
在C#中,內(nèi)存布局對于性能優(yōu)化和與非托管代碼的互操作性至關(guān)重要,StructLayout特性允許開發(fā)者控制結(jié)構(gòu)在內(nèi)存中的布局方式,本文給大家介紹了C#使用StructLayout特性來控制內(nèi)存結(jié)構(gòu)的操作,需要的朋友可以參考下

C#在調(diào)用WInAPI函數(shù)時,可能會看到如下的聲明

[StructLayout(LayoutKind.Sequential)]
         public struct RECT
         {
             public int Left;
             public int Top;
             public int Right;
             public int Bottom;
         }

在類或者結(jié)構(gòu)體前面帶上了

[StructLayout(LayoutKind.Sequential)]

StructLayoutAttribute特性的作用是允許你控制內(nèi)存中類或結(jié)構(gòu)的數(shù)據(jù)字段的物理布局。

平常我們在C#代碼中使用類或者結(jié)構(gòu)體時,不需要使用此特性。但在與非托管代碼時交互,需要使用StructLayoutAttribute特性來控制類型的非托管布局。

StructLayoutAttribute常用構(gòu)造函數(shù)是:

StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind)

System.Runtime.InteropServices.LayoutKind是一個枚舉類型,有三個取值。

LayoutKind.Sequential

強制按成員的顯示順序?qū)ζ溥M(jìn)行排列。對于blittable類型,在托管和非托管內(nèi)存中控制布局。對于non-blittable類型,它會在將類或者結(jié)構(gòu)體封送到非托管代碼時控制布局(換言之,如果僅在C#中進(jìn)行調(diào)用,不會做任何操作,在與非托管代碼交互時,僅控制送入非托管代碼的布局)

LayoutKind.Explicit

控制每個數(shù)據(jù)成員的精確位置,這會影響托管和非托管代碼中的布局,不管是blittable類型還是non-blittable類型。,使用LayoutKind.Explicit時,需要使用FieldOffsetAttribute特性指示類型中每個字段的位置。

默認(rèn)情況下,編譯器會將LayoutKind.Sequential應(yīng)用到結(jié)構(gòu)體,對于類,需要顯式應(yīng)用LayoutKind.Sequential值。

到這里也就明白了,以后在調(diào)用API函數(shù)時,如果使用的是結(jié)構(gòu)體,就不再需要下面這句代碼了。

[StructLayout(LayoutKind.Sequential)]

下面用示例代碼說明一下

這里以獲取桌面窗體的寬高為例,需要用到的API函數(shù)是

HWND GetDesktopWindow();

BOOL GetWindowRect(HWND hWnd, LPRECT lpRect );

其中LPRECT是指向RECT結(jié)構(gòu)體的指針,RECT結(jié)構(gòu)聲明如下:

typedef struct tagRECT {
   LONG left;
   LONG top;
   LONG right;
   LONG bottom;
 } RECT, *PRECT, *NPRECT, *LPRECT;

使用結(jié)構(gòu)體時,調(diào)用代碼如下:

using System;
using System.Runtime.InteropServices;
 namespace ConsoleApp10
 {
     public struct RECT
     {
         public int Left;
         public int Top;
         public int Right;
         public int Bottom;
     }
 
     class Program
     {
         [DllImport("user32.dll")]
         private static extern IntPtr GetDesktopWindow();
 
         [DllImport("user32.dll", SetLastError = true)]
         private static extern int GetWindowRect(IntPtr hwnd, out RECT rc);
 
         static void Main(string[] args)
         {
             IntPtr hwnd = GetDesktopWindow();
             RECT rect;
             GetWindowRect(hwnd, out rect);
             Console.WriteLine($"Left:{rect.Left},Top:{rect.Top},Right:{rect.Right},Bottom:{rect.Bottom}");
         }
     }
 }

運行結(jié)果如下:

下面我們來看一下,把結(jié)構(gòu)體換成類的情況

 using System;
 using System.Runtime.InteropServices;
 
 namespace ConsoleApp10
 {
     public class RECT
     {
         public int Left;
         public int Top;
         public int Right;
         public int Bottom;
    }
 
     class Program
     {
         [DllImport("user32.dll")]
         private static extern IntPtr GetDesktopWindow();
 
         [DllImport("user32.dll", SetLastError = true)]
         private static extern int GetWindowRect(IntPtr hwnd,RECT rc);
 
         static void Main(string[] args)
         {
             IntPtr hwnd = GetDesktopWindow();
             RECT rect = new RECT();
             GetWindowRect(hwnd, rect);
             Console.WriteLine($"Left:{rect.Left},Top:{rect.Top},Right:{rect.Right},Bottom:{rect.Bottom}");
         }
     }
 }

運行結(jié)果如下:

運行結(jié)果并不正常

把類修改一下,帶上[StructLayout(LayoutKind.Sequential)]

     [StructLayout(LayoutKind.Sequential)]
     public class RECT
     {
         public int Left;
         public int Top;
         public int Right;
         public int Bottom;
     }

再次運行,發(fā)現(xiàn)結(jié)果正常了

最后再看看LayoutKind.Explicit的情況,調(diào)用代碼如下

 using System;
 using System.Runtime.InteropServices;
 
 namespace ConsoleApp10
 {
     [StructLayout(LayoutKind.Explicit)]
     public class RECT
     {
         [FieldOffset(0)]public int Left; //FieldOffset用于指示類或結(jié)構(gòu)的非托管表示形式中字段的物理位置
         [FieldOffset(4)]public int Top;
         [FieldOffset(8)]public int Right;
         [FieldOffset(12)]public int Bottom;
     }
 
     class Program
     {
         [DllImport("user32.dll")]
         private static extern IntPtr GetDesktopWindow();
 
         [DllImport("user32.dll", SetLastError = true)]
         private static extern int GetWindowRect(IntPtr hwnd,[MarshalAs(UnmanagedType.LPStruct)]RECT rc);
 
         static void Main(string[] args)
         {
             IntPtr hwnd = GetDesktopWindow();
             RECT rect = new RECT();
             GetWindowRect(hwnd, rect);
             Console.WriteLine($"Left:{rect.Left},Top:{rect.Top},Right:{rect.Right},Bottom:{rect.Bottom}");
         }
     }
 }

以上就是C#使用StructLayout特性來控制內(nèi)存結(jié)構(gòu)的操作代碼的詳細(xì)內(nèi)容,更多關(guān)于C# StructLayout控制內(nèi)存結(jié)構(gòu)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#使用NPOI上傳excel

    C#使用NPOI上傳excel

    這篇文章主要為大家詳細(xì)介紹了C#使用NPOI上傳excel的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • C#自動刪除Word文檔空白行和空白頁的完整代碼

    C#自動刪除Word文檔空白行和空白頁的完整代碼

    在處理 Word 文檔時,經(jīng)常會遇到空白行、空表格或空白頁的問題,這不僅影響排版美觀,還可能導(dǎo)致文檔頁數(shù)冗余,所以本文將介紹如何使用 Spire.Doc for .NET 在 C# 中自動刪除 Word 文檔的空白行、空表格和空白頁,需要的朋友可以參考下
    2025-08-08
  • C#中Property和Attribute的區(qū)別實例詳解

    C#中Property和Attribute的區(qū)別實例詳解

    這篇文章主要介紹了C#中Property和Attribute的區(qū)別,較為詳細(xì)的分析了C#中Property和Attribute的功能、定義、區(qū)別及使用時的相關(guān)注意事項,需要的朋友可以參考下
    2015-06-06
  • C# Winform TextBox控件多行輸入方式

    C# Winform TextBox控件多行輸入方式

    這篇文章主要介紹了C# Winform TextBox控件多行輸入方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • C#操作Word模擬解析HTML標(biāo)記輸出帶格式的文本

    C#操作Word模擬解析HTML標(biāo)記輸出帶格式的文本

    這篇文章介紹了一種解決Word文檔格式設(shè)置問題的方案,通過HTML標(biāo)記化文本內(nèi)容,利用正則表達(dá)式提取關(guān)鍵字,并對Word字符集對象逐字操作來重置格式,感興趣的小伙伴可以了解下
    2026-01-01
  • c#實現(xiàn)flv解析詳解示例

    c#實現(xiàn)flv解析詳解示例

    本文提供的解析程序簡單的把FLV分解了出來,如果要做FLV的修改操作的話,可以給每個類加個toStream方法,再歷遍依次調(diào)用就可以寫回到文件里了
    2014-01-01
  • c#實現(xiàn)哈夫曼樹算法

    c#實現(xiàn)哈夫曼樹算法

    這篇文章介紹了c#實現(xiàn)哈夫曼樹的實例代碼,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C# 利用代理爬蟲網(wǎng)頁的實現(xiàn)方法

    C# 利用代理爬蟲網(wǎng)頁的實現(xiàn)方法

    這篇文章主要介紹了C# 利用代理爬網(wǎng)頁的實現(xiàn)方法的相關(guān)資料,希望通過本能幫助到大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • .NET實現(xiàn)父窗體關(guān)閉而不影響子窗體的方法

    .NET實現(xiàn)父窗體關(guān)閉而不影響子窗體的方法

    這篇文章主要介紹了.NET實現(xiàn)父窗體關(guān)閉而不影響子窗體的方法,很實用的功能,需要的朋友可以參考下
    2014-08-08
  • Unity實現(xiàn)蘋果手機(jī)Taptic震動

    Unity實現(xiàn)蘋果手機(jī)Taptic震動

    這篇文章主要介紹了Unity實現(xiàn)蘋果手機(jī)Taptic震動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10

最新評論

定州市| 南和县| 澄江县| 南陵县| 沾益县| 博湖县| 乡宁县| 乌拉特前旗| 乌鲁木齐市| 靖西县| 耿马| 集安市| 巴林右旗| 尚志市| 龙门县| 内江市| 桐柏县| 涞水县| 晋州市| 大埔区| 荣成市| 临颍县| 新河县| 兴义市| 望奎县| 山东| 双牌县| 南昌市| 沙田区| 莲花县| 丹凤县| 永城市| 山阳县| 乐陵市| 博湖县| 射阳县| 中方县| 南投县| 新蔡县| 石林| 金华市|