處理結(jié)構(gòu)內(nèi)的C#數(shù)組淺析
C#有很多值得學(xué)習(xí)的地方,這里我們主要介紹C#數(shù)組,包括介紹C#中引用類(lèi)型的類(lèi)似定義語(yǔ)法等方面。
在 C/C++ 中這樣在結(jié)構(gòu)中使用C#數(shù)組是完全正確的,因?yàn)檫@些數(shù)組將作為整個(gè)結(jié)構(gòu)的一部分,在對(duì)結(jié)構(gòu)操作時(shí)直接訪(fǎng)問(wèn)結(jié)構(gòu)所在內(nèi)存塊。但在 C# 這類(lèi)語(yǔ)言中,則無(wú)法直接如此使用,因?yàn)镃#數(shù)組是作為一種特殊的引用類(lèi)型存在的,如定義:
以下內(nèi)容為程序代碼:
- public struct IMAGE_DATA_DIRECTORY
- {
- public uint VirtualAddress;
- public uint Size;
- }
- public struct IMAGE_OPTIONAL_HEADER
- {
- public const int IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;
- public ushort Magic;
- //...
- public uint NumberOfRvaAndSizes;
- public IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
- }
在C#中這樣定義結(jié)構(gòu)中的數(shù)組是錯(cuò)誤的,會(huì)在編譯時(shí)獲得一個(gè) CS0650 錯(cuò)誤:
引用:error CS0650: 語(yǔ)法錯(cuò)誤,錯(cuò)誤的C#數(shù)組聲明符。若要聲明托管數(shù)組,秩說(shuō)明符應(yīng)位于變量標(biāo)識(shí)符之前
如果改用C#中引用類(lèi)型的類(lèi)似定義語(yǔ)法,以下內(nèi)容為程序代碼:
- public struct IMAGE_OPTIONAL_HEADER
- {
- public const int IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;
- public ushort Magic;
- //...
- public uint NumberOfRvaAndSizes;
- public IMAGE_DATA_DIRECTORY[] DataDirectory = new
IMAGE_DATA_DIRECTORY[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];- }
則得到一個(gè) CS0573 錯(cuò)誤:
引用:error CS0573: “IMAGE_OPTIONAL_HEADER.DataDirectory” : 結(jié)構(gòu)中不能有實(shí)例字段初始值設(shè)定項(xiàng)
因?yàn)榻Y(jié)構(gòu)內(nèi)是不能夠有引用類(lèi)型的初始化的,這與 class 的初始化工作不同。如此一來(lái)只能將數(shù)組的初始化放到構(gòu)造函數(shù)中,而且結(jié)構(gòu)還不能有無(wú)參數(shù)的缺省構(gòu)造函數(shù),真是麻煩,以下內(nèi)容為程序代碼:
- public struct IMAGE_OPTIONAL_HEADER
- {
- public const int IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;
- public ushort Magic;
- public uint NumberOfRvaAndSizes;
- public IMAGE_DATA_DIRECTORY[] DataDirectory;
- public IMAGE_OPTIONAL_HEADER(IntPtr ptr)
- {
- Magic = 0;
- NumberOfRvaAndSizes = 0;
- DataDirectory = new IMAGE_DATA_DIRECTORY[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
- }
- }
這樣一來(lái)看起來(lái)似乎能使了,但如果使用 Marshal.SizeOf(typeof(IMAGE_OPTIONAL_HEADER)) 看看就會(huì)發(fā)現(xiàn),其長(zhǎng)度根本就跟 C/C++ 中定義的長(zhǎng)度不同。問(wèn)題還是在于結(jié)構(gòu)中C#數(shù)組,雖然看起來(lái)此數(shù)組是定義在結(jié)構(gòu)內(nèi),但實(shí)際上在此結(jié)構(gòu)中只有一個(gè)指向 IMAGE_DATA_DIRECTORY[] 數(shù)組類(lèi)型的指針而已,本應(yīng)保存在 DataDirectory 未知的數(shù)組內(nèi)容,是在托管堆中。
【編輯推薦】