日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
處理結(jié)構(gòu)內(nèi)的C#數(shù)組淺析

C#有很多值得學(xué)習(xí)的地方,這里我們主要介紹C#數(shù)組,包括介紹C#中引用類型的類似定義語法等方面。

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

以下內(nèi)容為程序代碼:

 
 
 
  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#中這樣定義結(jié)構(gòu)中的數(shù)組是錯誤的,會在編譯時獲得一個 CS0650 錯誤:

引用:error CS0650: 語法錯誤,錯誤的C#數(shù)組聲明符。若要聲明托管數(shù)組,秩說明符應(yīng)位于變量標(biāo)識符之前

如果改用C#中引用類型的類似定義語法,以下內(nèi)容為程序代碼:

 
 
 
  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 錯誤:

引用:error CS0573: “IMAGE_OPTIONAL_HEADER.DataDirectory” : 結(jié)構(gòu)中不能有實例字段初始值設(shè)定項

因為結(jié)構(gòu)內(nèi)是不能夠有引用類型的初始化的,這與 class 的初始化工作不同。如此一來只能將數(shù)組的初始化放到構(gòu)造函數(shù)中,而且結(jié)構(gòu)還不能有無參數(shù)的缺省構(gòu)造函數(shù),真是麻煩,以下內(nèi)容為程序代碼:

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


網(wǎng)頁標(biāo)題:處理結(jié)構(gòu)內(nèi)的C#數(shù)組淺析
文章位置:http://www.5511xx.com/article/djighoi.html