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

淺析C#引用類型數組

開發 后端
本文介紹C#引用類型數組,看起來此數組是定義在結構內,但實際上在此結構中只有一個指向 IMAGE_DATA_DIRECTORY[] 數組類型的指針而已。

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

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

  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#引用類型數組的似定義語法,如

  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. }  

因為結構內是不能夠有引用類型的初始化的,這與 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. }  
  18. }  

這樣一來看起來似乎能使了,但如果使用 Marshal.SizeOf(typeof(IMAGE_OPTIONAL_HEADER)) 看看就會發現,其長度根本就跟 C/C++ 中定義的長度不同。問題還是在于結構中數組,雖然看起來此數組是定義在結構內,但實際上在此結構中只有一個指向 IMAGE_DATA_DIRECTORY[] 數組類型的指針而已,本應保存在 DataDirectory 未知的數組內容,是在托管堆中。
于是問題就變成如何將C#引用類型數組,放在一個值類型的結構中。

【編輯推薦】

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

2009-08-26 13:07:07

C#交錯數組

2009-07-31 18:39:31

C#中foreach引

2009-08-14 17:09:48

C#引用類型

2009-08-07 13:39:13

C#定義整型數組

2009-08-18 12:52:33

C#枚舉類型

2009-08-18 10:35:46

C#枚舉類型

2009-09-02 10:58:02

C#動態數組

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-09-18 10:58:31

C#數組操作

2009-08-28 14:25:57

C# byte數組

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# 強制類型轉換

2009-08-19 16:39:44

C#值類型C#引用類型

2009-08-26 14:05:19

C#值類型和引用類型

2009-09-23 09:36:34

C#數組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 青草福利 | 一呦二呦三呦国产精品 | 中文字幕在线观 | 日韩三级在线 | 亚洲精品黑人 | 亚洲国产成人精品女人久久久 | 欧美日本韩国一区二区 | 人人性人人性碰国产 | 国产精品视频999 | 谁有毛片| 夜夜夜夜夜夜曰天天天 | 色视频在线免费观看 | 欧美日韩国产一区二区 | 天堂在线网 | 亚洲高清视频在线观看 | 夜夜爽99久久国产综合精品女不卡 | h视频免费在线观看 | 黄色免费在线网址 | 亚洲一区欧美一区 | 国产成人久久精品一区二区三区 | 日韩欧美在线不卡 | 久久精品一区二区三区四区 | 国产精品99久久久久久久久久久久 | 国产精品视频一区二区三区不卡 | 伊人一二三| 国产高清在线精品一区二区三区 | 久久精品视频在线免费观看 | 亚洲成人毛片 | 午夜精品网站 | 成人夜晚看av | 国产一级免费视频 | 国产不卡一区在线观看 | 日韩午夜在线播放 | 91精品国产综合久久久久久 | 国产美女精品视频 | 国产精品高潮呻吟 | 99精品久久 | 亚洲天堂免费 | 国产精品一区二区在线免费观看 | 久久综合久 | 色精品|