成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談C#數組結構

開發 后端
本文介紹C#數組結構,在C#中這樣在結構中使用數組是完全正確的,因為這些數組將作為整個結構的一部分,在對結構操作時直接訪問結構所在內存塊。

在 C# 代碼中,大量摻雜著包括普通類型和C#數組結構,如定義 PE 文件頭結構的 IMAGE_OPTIONAL_HEADER 結構定義如下:

  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#中這樣在結構中使用數組是完全正確的,因為這些數組將作為整個結構的一部分,在對結構操作時直接訪問結構所在內存塊。但在 C# 這類語言中,則無法直接如此使用,因為數組是作為一種特殊的引用類型存在的,如定義:

  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#數組結構中的錯誤,會在編譯時獲得一個 CS0650 錯誤:

語法錯誤,錯誤的數組聲明符。若要聲明托管數組,秩說明符應位于變量標識符之前,如果改用 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];  

則得到一個 CS0573 錯誤:結構中不能有實例字段初始值設定項

因為結構內是不能夠有引用類型的初始化的,這與 class 的初始化工作不同。如此一來只能將數組的初始化放到構造函數中,而且結構還不能有無參數的缺省構造函數,真是麻煩。

  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)) 看看就會發現,其長度根本就跟 C/C++ 中定義的長度不同。問題還是在于結構中數組,雖然看起來此數組是定義在結構內,但實際上在此結構中只有一個指向 IMAGE_DATA_DIRECTORY[] 數組類型的指針而已,本應保存在 DataDirectory 未知的數組內容,是在托管堆中。以上介紹C#數組結構中的錯誤。

【編輯推薦】

  1. C#記憶功能的地址欄控件
  2. 描述C#調用外部進程
  3. C#語言操縱數據庫事務
  4. 概述C#語言異常處理
  5. 簡單介紹C#數組和函數
責任編輯:佚名 來源: yesky
相關推薦

2011-09-21 10:56:31

C#結構

2009-09-17 17:13:54

C#數組

2009-08-13 15:03:58

C#結構體變量

2009-09-02 17:07:06

C#數組操作

2009-08-13 18:36:29

C#數組工作方式

2009-09-17 16:36:59

C#一維數組C#多維數組

2009-08-20 18:30:33

C# ReaderWr

2009-07-31 14:20:46

結構數組C#函數的參數

2009-09-23 09:36:34

C#數組

2009-08-12 11:24:25

C# String對象

2009-08-31 09:37:09

C# Employee

2009-08-19 17:12:18

C# Connecti

2009-08-26 13:15:38

C#選擇控制

2009-08-26 15:46:01

C#匿名類型

2009-08-25 16:16:43

C# oledbcon

2009-08-14 17:58:05

C#接口方法

2009-08-20 10:24:52

C#開發WinForm

2009-09-02 15:41:21

C# HTTPWebR

2009-08-06 15:30:23

C#類型系統

2009-08-10 10:04:25

C#抽象類C#接口
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩国产黄色片 | 日韩欧美亚洲 | 青青草原精品99久久精品66 | 亚洲视频一区在线 | 高清av电影 | 九九99久久| 欧美一二区 | 久久久久久久久久一区二区 | 99免费在线观看视频 | 日韩成人精品一区二区三区 | 亚洲在线视频 | 亚洲欧美日韩精品久久亚洲区 | 亚洲综合久久久 | 国产欧美精品区一区二区三区 | 亚洲视频一区二区三区 | 97精品一区二区 | 亚州春色 | 亚洲精品91 | 亚洲精品66 | 水蜜桃久久夜色精品一区 | 一区二区三区欧美在线 | 亚洲精品久久久一区二区三区 | www.99re| 国产免费一区二区 | 黄色大片免费网站 | 色综合欧美 | 免费一区在线 | 国产精品视频免费播放 | 九色av | 黄色av免费网站 | 国产一区二区精品在线观看 | 99精品久久久国产一区二区三 | 国产一二三区精品视频 | 激情福利视频 | 精品一区二区三区中文字幕 | 亚洲日本一区二区 | 日韩欧美一区二区在线播放 | 欧美成人精品 | 毛片一区二区三区 | 久久高清精品 | 成人三级网址 |