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

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

開發(fā) 后端
本文介紹C#引用類型數(shù)組,看起來此數(shù)組是定義在結(jié)構(gòu)內(nèi),但實際上在此結(jié)構(gòu)中只有一個指向 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ù)組是完全正確的,因為這些數(shù)組將作為整個結(jié)構(gòu)的一部分,在對結(jié)構(gòu)操作時直接訪問結(jié)構(gòu)所在內(nèi)存塊。但在 C# 這類語言中,則無法直接如此使用,因為數(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. }  

因為結(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)) 看看就會發(fā)現(xiàn),其長度根本就跟 C/C++ 中定義的長度不同。問題還是在于結(jié)構(gòu)中數(shù)組,雖然看起來此數(shù)組是定義在結(jié)構(gòu)內(nèi),但實際上在此結(jié)構(gòu)中只有一個指向 IMAGE_DATA_DIRECTORY[] 數(shù)組類型的指針而已,本應(yīng)保存在 DataDirectory 未知的數(shù)組內(nèi)容,是在托管堆中。
于是問題就變成如何將C#引用類型數(shù)組,放在一個值類型的結(jié)構(gòu)中。

【編輯推薦】

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

2009-08-26 13:07:07

C#交錯數(shù)組

2009-07-31 18:39:31

C#中foreach引

2009-08-14 17:09:48

C#引用類型

2009-08-07 13:39:13

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

2009-08-18 12:52:33

C#枚舉類型

2009-08-18 10:35:46

C#枚舉類型

2009-09-02 10:58:02

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

2009-09-03 16:55:58

C#引用類型

2009-09-11 11:09:36

C#引用類型

2009-08-03 17:51:43

C#引用類型

2009-09-11 11:17:04

C#引用類型

2009-09-18 10:58:31

C#數(shù)組操作

2009-08-28 14:25:57

C# byte數(shù)組

2009-08-18 13:00:59

C#枚舉類型

2009-08-18 09:37:14

C#枚舉類型

2009-08-24 14:51:25

C# 泛型泛型類型

2009-08-24 14:20:13

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

2009-08-19 16:39:44

C#值類型C#引用類型

2009-08-26 14:05:19

C#值類型和引用類型

2009-09-23 09:36:34

C#數(shù)組
點贊
收藏

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

主站蜘蛛池模板: 欧美一区二区三区在线播放 | www.日韩| 一级片在线视频 | 亚洲精品久久久久久下一站 | 在线观看亚洲精品 | 在线观看成年人视频 | 韩国精品一区 | 精品国产一二三区 | 91xxx在线观看| 在线中文字幕视频 | 色婷婷精品国产一区二区三区 | 2一3sex性hd| 欧美极品在线 | 久久国内精品 | 精品九九在线 | 99精品免费视频 | 在线免费黄色 | 久久大| av在线黄 | 久久精品亚洲精品国产欧美 | 91亚洲精| 97精品国产手机 | 国产欧美日韩 | 欧美日韩成人影院 | 亚洲精品第一 | 精品视频一区二区三区在线观看 | 91免费观看视频 | 国产精品久久久久久吹潮 | 久操亚洲| 美女在线一区二区 | 亚洲一区中文字幕在线观看 | 亚洲精品高清视频在线观看 | 在线观看黄视频 | 九九视频网 | 黄色大片免费播放 | 日韩在线免费视频 | 国产一区欧美 | 国产免费自拍 | 久久久精品 | 欧美久久电影 | 伊人成人免费视频 |