共用方式為


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

在 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 陣列是對堆積 (Heap) 配置陣列的參考:

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

從 C# 2.0 開始,struct 可以包含內嵌陣列。在下列範例中,fixedBuffer 陣列有固定的大小。若要存取陣列的項目,您可以使用 fixed 陳述式來建立第一個項目的指標。fixed 陳述式會將 fixedBuffer 的執行個體固定至記憶體中的特定位置。

namespace FixedSizeBuffers
{
    internal unsafe struct MyBuffer
    {
        public fixed char fixedBuffer[128];
    }

    internal unsafe class MyClass
    {
        public MyBuffer myBuffer = default(MyBuffer);
    }

    internal class Program
    {
        static void Main()
        {
            MyClass myC = new MyClass();

            unsafe
            {
                // Pin the buffer to a fixed location in memory.
                fixed (char* charPtr = myC.myBuffer.fixedBuffer)
                {
                    *charPtr = 'A';
                }
            }
        }
    }
}

有 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 緩衝區只能是結構的執行個體欄位。

請參閱

參考

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

fixed 陳述式 (C# 參考)

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

概念

C# 程式設計手冊