日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺析C#引用類型數(shù)組

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

成都創(chuàng)新互聯(lián)公司自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目做網(wǎng)站、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元仁和做網(wǎng)站,已為上家服務(wù),為仁和各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575

 
 
 
  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)的一部分,在對(duì)結(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. public ushort Magic;
  5. public uint NumberOfRvaAndSizes;
  6. public IMAGE_DATA_DIRECTORY[] DataDirectory;
  7. public IMAGE_OPTIONAL_HEADER(IntPtr ptr)
  8. {
  9. Magic = 0;
  10. NumberOfRvaAndSizes = 0;
  11. DataDirectory = new IMAGE_DATA_DIRECTORY[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
  12. }
  13. }

這樣一來看起來似乎能使了,但如果使用 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)中。


網(wǎng)站欄目:淺析C#引用類型數(shù)組
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/dhihccp.html