當您使用現有程式碼時,例如以其他語言撰寫的程式碼、已存在的 DLL 或 COM 專案,能夠建立固定大小的資料結構會非常有用。
[attributes][modifiers]fixed type identifier [expression];
參數
參數 | 說明 |
---|---|
attributes (選擇性) | 選擇性宣告式資訊。如需屬性和屬性類別的詳細資訊,請參閱屬性。 |
modifiers (選擇性) | 選擇性修飾詞包含 new 修飾詞和四種存取修飾詞的其中一種。 |
type | 其中一種型別:bool、byte、 char、 short、int、long、sbyte、ushort、uint、ulong、float 或 double。 |
identifier | 陣列的名稱。 |
expression | 評估陣列大小的運算式。 例如,下列陳述式會宣告一個固定大小的緩衝區 (name),其長度為 30:fixed char name[30]; |
在舊版 C# 中,宣告 C++ 樣式的固定大小結構會很困難,因為包含陣列的 C# 結構並不包含陣列元素,而是包含元素的參考。
C# 2.0 則加入了內嵌功能,當在
例如,在 C# 2.0 之前,下列 struct 的大小會是 8 個位元組,其中的 pathName 陣列是對配置在堆積中陣列的參考:
在 C# 2.0 中,struct 可以使用內嵌陣列來進行宣告:
public struct MyArray // This code must appear in an unsafe block { public fixed char pathName[128]; }
在這個結構中,pathName 的大小和位置都固定,因此可用於其他 Unsafe 程式碼。
有 128 個元素的 char 陣列大小為 256 個位元組。無論編碼方式為何,在固定大小的字元緩衝區中,每個字元都需要兩個位元組。即使當字元緩衝區用 CharSet = CharSet.Auto 或 CharSet = CharSet.Ansi 封送處理至 API 方法或結構,算法也是一樣。如需詳細資訊,請參閱 CharSet。
另一種常見的固定大小陣列就是 bool 陣列。bool 陣列中的元素大小通常為一個位元組。bool 陣列並不適合用來建立位元陣列或緩衝區。
注意事項 |
---|
除了使用 stackalloc 建立的記憶體以外,C# 編譯器和 Common Language Runtime (CLR) 並不執行任何安全性緩衝區滿溢 (Buffer Overrun) 檢查。與使用其他 Unsafe 程式碼一樣,請小心使用。 |
Unsafe 緩衝區與正常陣列的差異之處如下:
在 Unsafe 內容中只可使用 Unsafe 緩衝區。
Unsafe 緩衝區一律為向量 (即一維陣列)。
陣列的宣告應包含計數,例如 char id[8]。您不可以使用 char id[]。
在 Unsafe 內容中,Unsafe 緩衝區只能是結構的執行個體欄位。