自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談C#數(shù)組結(jié)構(gòu)

開發(fā) 后端
本文介紹C#數(shù)組結(jié)構(gòu),在C#中這樣在結(jié)構(gòu)中使用數(shù)組是完全正確的,因?yàn)檫@些數(shù)組將作為整個(gè)結(jié)構(gòu)的一部分,在對(duì)結(jié)構(gòu)操作時(shí)直接訪問結(jié)構(gòu)所在內(nèi)存塊。

在 C# 代碼中,大量摻雜著包括普通類型和C#數(shù)組結(jié)構(gòu),如定義 PE 文件頭結(jié)構(gòu)的 IMAGE_OPTIONAL_HEADER 結(jié)構(gòu)定義如下:

  1. typedef struct _IMAGE_DATA_DIRECTORY {  
  2. DWORD VirtualAddress;  
  3. DWORD Size;  
  4. } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;  
  5.  
  6. #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES16  
  7.  
  8. typedef struct _IMAGE_OPTIONAL_HEADER {  
  9.  
  10. WORDMagic;  
  11.  
  12. //...  
  13.  
  14. DWORD NumberOfRvaAndSizes;  
  15. IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];  
  16.  
  17. } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32; 

在C#中這樣在結(jié)構(gòu)中使用數(shù)組是完全正確的,因?yàn)檫@些數(shù)組將作為整個(gè)結(jié)構(gòu)的一部分,在對(duì)結(jié)構(gòu)操作時(shí)直接訪問結(jié)構(gòu)所在內(nèi)存塊。但在 C# 這類語言中,則無法直接如此使用,因?yàn)閿?shù)組是作為一種特殊的引用類型存在的,如定義:

  1. public struct IMAGE_DATA_DIRECTORY  
  2. {  
  3. public uint VirtualAddress;  
  4. public uint Size;  
  5. }  
  6.  
  7. public struct IMAGE_OPTIONAL_HEADER  
  8. {  
  9. public const int IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;  
  10.  
  11. public ushort Magic;  
  12.  
  13. //...  
  14.  
  15. public uint NumberOfRvaAndSizes;  
  16.  
  17. public IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];  

這樣定義C#數(shù)組結(jié)構(gòu)中的錯(cuò)誤,會(huì)在編譯時(shí)獲得一個(gè) CS0650 錯(cuò)誤:

語法錯(cuò)誤,錯(cuò)誤的數(shù)組聲明符。若要聲明托管數(shù)組,秩說明符應(yīng)位于變量標(biāo)識(shí)符之前,如果改用 C# 中引用類型的類似定義語法,如:

  1. public struct IMAGE_OPTIONAL_HEADER  
  2. {  
  3. public const int IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;  
  4.  
  5. public ushort Magic;  
  6.  
  7. //...  
  8.  
  9. public uint NumberOfRvaAndSizes;  
  10.  
  11. public IMAGE_DATA_DIRECTORY[] DataDirectory = 
    new IMAGE_DATA_DIRECTORY[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];  

則得到一個(gè) CS0573 錯(cuò)誤:結(jié)構(gòu)中不能有實(shí)例字段初始值設(shè)定項(xiàng)

因?yàn)榻Y(jié)構(gòu)內(nèi)是不能夠有引用類型的初始化的,這與 class 的初始化工作不同。如此一來只能將數(shù)組的初始化放到構(gòu)造函數(shù)中,而且結(jié)構(gòu)還不能有無參數(shù)的缺省構(gòu)造函數(shù),真是麻煩。

  1. public struct IMAGE_OPTIONAL_HEADER
  2. {  
  3. public const int IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;  
  4.  
  5. public ushort Magic;  
  6.  
  7. public uint NumberOfRvaAndSizes;  
  8.  
  9. public IMAGE_DATA_DIRECTORY[] DataDirectory;  
  10.  
  11. public IMAGE_OPTIONAL_HEADER(IntPtr ptr)  
  12. {  
  13. Magic = 0;  
  14. NumberOfRvaAndSizes = 0;  
  15.  
  16. DataDirectory = new IMAGE_DATA_DIRECTORY[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];  
  17. }  

這樣一來看起來似乎能使了,但如果使用 Marshal.SizeOf(typeof(IMAGE_OPTIONAL_HEADER)) 看看就會(huì)發(fā)現(xiàn),其長(zhǎng)度根本就跟 C/C++ 中定義的長(zhǎng)度不同。問題還是在于結(jié)構(gòu)中數(shù)組,雖然看起來此數(shù)組是定義在結(jié)構(gòu)內(nèi),但實(shí)際上在此結(jié)構(gòu)中只有一個(gè)指向 IMAGE_DATA_DIRECTORY[] 數(shù)組類型的指針而已,本應(yīng)保存在 DataDirectory 未知的數(shù)組內(nèi)容,是在托管堆中。以上介紹C#數(shù)組結(jié)構(gòu)中的錯(cuò)誤。

【編輯推薦】

  1. C#記憶功能的地址欄控件
  2. 描述C#調(diào)用外部進(jìn)程
  3. C#語言操縱數(shù)據(jù)庫事務(wù)
  4. 概述C#語言異常處理
  5. 簡(jiǎn)單介紹C#數(shù)組和函數(shù)
責(zé)任編輯:佚名 來源: yesky
相關(guān)推薦

2011-09-21 10:56:31

C#結(jié)構(gòu)

2009-09-17 17:13:54

C#數(shù)組

2009-09-02 17:07:06

C#數(shù)組操作

2009-08-13 15:03:58

C#結(jié)構(gòu)體變量

2009-09-17 16:36:59

C#一維數(shù)組C#多維數(shù)組

2009-08-13 18:36:29

C#數(shù)組工作方式

2009-08-20 18:30:33

C# ReaderWr

2009-07-31 14:20:46

結(jié)構(gòu)數(shù)組C#函數(shù)的參數(shù)

2009-09-23 09:36:34

C#數(shù)組

2009-08-12 11:24:25

C# String對(duì)象

2009-08-19 17:12:18

C# Connecti

2009-08-31 09:37:09

C# Employee

2009-08-25 16:16:43

C# oledbcon

2009-08-26 15:46:01

C#匿名類型

2009-08-06 15:30:23

C#類型系統(tǒng)

2009-08-14 17:58:05

C#接口方法

2009-08-26 13:15:38

C#選擇控制

2009-09-02 15:41:21

C# HTTPWebR

2009-08-20 10:24:52

C#開發(fā)WinForm

2009-08-13 13:03:52

C#結(jié)構(gòu)體數(shù)組
點(diǎn)贊
收藏

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