共用方式為


固定大小緩衝區 (C# 程式設計手冊)

更新:2007 年 11 月

在 C# 中,您可以使用 fixed 陳述式 (Statement),在資料結構中建立具有固定大小陣列的緩衝區。這個處理方式在使用現有的程式碼時會非常實用,例如,以其他語言撰寫的程式碼、已存在的 DLL 或 COM 專案。固定的陣列可以帶有正規的結構成員所允許之任何屬性 (Attribute) 或修飾詞 (Modifier)。唯一的限制是陣列型別 (Array Type) 必須為 bool、byte、 char、 short、int、long、sbyte、ushort、uint、ulong、float 或 double。

private fixed char name[30];

備註

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

C# 2.0 則加入了內嵌功能,當在 unsafe 程式碼區塊中使用時,可將固定大小的陣列嵌入結構內。

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

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

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

請參閱

概念

C# 程式設計手冊

參考

Unsafe 程式碼和指標 (C# 程式設計手冊)

fixed 陳述式 (C# 參考)

互通性 (C# 程式設計手冊)