close

 

當您使用現有程式碼時,例如以其他語言撰寫的程式碼、已存在的 DLL 或 COM 專案,能夠建立固定大小的資料結構會非常有用。

[attributes][modifiers]fixed type identifier [expression];

 

參數

參數 說明

attributes (選擇性)

選擇性宣告式資訊。如需屬性和屬性類別的詳細資訊,請參閱屬性

modifiers (選擇性)

選擇性修飾詞包含 new 修飾詞和四種存取修飾詞的其中一種。

type

其中一種型別:boolbyte char shortintlongsbyteushortuintulongfloatdouble

identifier

陣列的名稱。

expression

評估陣列大小的運算式。

例如,下列陳述式會宣告一個固定大小的緩衝區 (name),其長度為 30:fixed char name[30];

備註

在舊版 C# 中,宣告 C++ 樣式的固定大小結構會很困難,因為包含陣列的 C# 結構並不包含陣列元素,而是包含元素的參考。

C# 2.0 則加入了內嵌功能,當在

例如,在 C# 2.0 之前,下列 struct 的大小會是 8 個位元組,其中的 pathName 陣列是對配置在堆積中陣列的參考:

public struct MyArray
{
    public char[] pathName;
    private int reserved;
}

在 C# 2.0 中,struct 可以使用內嵌陣列來進行宣告:

C#
public struct MyArray // This code must appear in an unsafe block
{
    public fixed char pathName[128];
}

在這個結構中,pathName 的大小和位置都固定,因此可用於其他 Unsafe 程式碼。

有 128 個元素的 char 陣列大小為 256 個位元組。無論編碼方式為何,在固定大小的字元緩衝區中,每個字元都需要兩個位元組。即使當字元緩衝區用 CharSet = CharSet.AutoCharSet = 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 緩衝區只能是結構的執行個體欄位。

unsafe 程式碼區塊中使用時,可將大小固定的陣列嵌入結構內。
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 11 的頭像
    11

    冠霖的部落格

    11 發表在 痞客邦 留言(0) 人氣()