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

淺析C#引用類型數(shù)組

開發(fā) 后端
本文介紹C#引用類型數(shù)組,看起來此數(shù)組是定義在結(jié)構(gòu)內(nèi),但實(shí)際上在此結(jié)構(gòu)中只有一個(gè)指向 IMAGE_DATA_DIRECTORY[] 數(shù)組類型的指針而已。

在 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. }  
  5. IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;  
  6. #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16  
  7. typedef struct _IMAGE_OPTIONAL_HEADER {  
  8. WORD Magic;  
  9. DWORD NumberOfRvaAndSizes;  
  10. IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];  
  11. }  

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

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

如果改用 C#引用類型數(shù)組的似定義語法,如

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

因?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. }  
  18. }  

這樣一來看起來似乎能使了,但如果使用 Marshal.SizeOf(typeof(IMAGE_OPTIONAL_HEADER)) 看看就會(huì)發(fā)現(xiàn),其長度根本就跟 C/C++ 中定義的長度不同。問題還是在于結(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ù)組,放在一個(gè)值類型的結(jié)構(gòu)中。

【編輯推薦】

  1. 分析C#不安全代碼
  2. 淺析C#調(diào)用ImageAnimator
  3. C#連接Access、SQL Server數(shù)據(jù)庫
  4. 淺談C#固定的和活動(dòng)的變量
  5. 介紹C#中的值類型
責(zé)任編輯:佚名 來源: 博客園
相關(guān)推薦

2009-08-26 13:07:07

C#交錯(cuò)數(shù)組

2009-08-14 17:09:48

C#引用類型

2009-07-31 18:39:31

C#中foreach引

2009-08-07 13:39:13

C#定義整型數(shù)組

2009-08-18 10:35:46

C#枚舉類型

2009-08-18 12:52:33

C#枚舉類型

2009-09-02 10:58:02

C#動(dòng)態(tài)數(shù)組

2009-09-11 11:09:36

C#引用類型

2009-08-03 17:51:43

C#引用類型

2009-09-11 11:17:04

C#引用類型

2009-09-03 16:55:58

C#引用類型

2009-08-28 14:25:57

C# byte數(shù)組

2009-09-18 10:58:31

C#數(shù)組操作

2009-08-24 14:51:25

C# 泛型泛型類型

2009-08-18 09:37:14

C#枚舉類型

2009-08-19 16:39:44

C#值類型C#引用類型

2009-08-26 14:05:19

C#值類型和引用類型

2009-08-18 13:00:59

C#枚舉類型

2009-08-24 14:20:13

C# 強(qiáng)制類型轉(zhuǎn)換

2009-08-27 16:39:26

C# String類型
點(diǎn)贊
收藏

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