共用方式為


sizeof 運算符 - 判斷指定類型的記憶體需求

sizeof 運算符會傳回指定類型變數所佔用的位元組數目。 在安全程式碼中,運算 sizeof 子的參數必須是內建 的非受管理型態 名稱,且其大小不依賴於平台。

C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。

文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。

小提示

欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。

下表所示的表達式在編譯時會被評估到對應的常數值,且不需要不安全的上下文:

表達 常數值
sizeof(sbyte) 1
sizeof(byte) 1
sizeof(short) 2
sizeof(ushort) 2
sizeof(int) 4
sizeof(uint) 4
sizeof(long) 8
sizeof(ulong) 8
sizeof(char) 2
sizeof(float) 4
sizeof(double) 8
sizeof(decimal) 16
sizeof(bool) 1

前表中型別的大小為編譯時常數。

不安全的程式碼中,你可以對任何非void型態使用sizeof,包括由型別參數構成的型別。

  • 參考或指標類型的大小是參考或指標的大小,而非它可能參考的物件大小。
  • 值型態的大小,不論是否未受管理,就是該值的大小。
  • 型別大小 ref struct 即值的大小。 每個 ref 欄位的大小是參考或指標的大小,而非它所指稱的值大小。

下列範例示範 sizeof 運算子的使用方式:

public struct Point
{
    public Point(byte tag, double x, double y) => (Tag, X, Y) = (tag, x, y);

    public byte Tag { get; }
    public double X { get; }
    public double Y { get; }
}

public class SizeOfOperator
{
    public static void Main()
    {
        Console.WriteLine(sizeof(byte));  // output: 1
        Console.WriteLine(sizeof(double));  // output: 8

        DisplaySizeOf<Point>();  // output: Size of Point is 24
        DisplaySizeOf<decimal>();  // output: Size of System.Decimal is 16

        unsafe
        {
            Console.WriteLine(sizeof(Point*));  // output: 8
            Console.WriteLine(sizeof(nint));  // output: 8 on 64-bit, 4 on 32-bit
            Console.WriteLine(sizeof(nuint)); // output: 8 on 64-bit, 4 on 32-bit
            Console.WriteLine(sizeof(Span<int>));  // output: 16 on 64-bit, 12 on 32-bit
        }
    }

    static unsafe void DisplaySizeOf<T>() where T : unmanaged
    {
        Console.WriteLine($"Size of {typeof(T)} is {sizeof(T)}");
    }
}

sizeof 運算符會傳回由 Common Language Runtime 於 managed memory 中配置的位元數。 針對 結構 型別,該值包括任何填補,如前述範例所示。 sizeof 運算符的結果可能與 Marshal.SizeOf 方法的結果不同,此方法會傳回非受控 記憶體 類型的大小。

重要

sizeof 傳回的值可能與 Marshal.SizeOf(Object)的結果不同,因為 Marshal.SizeOf(Object)即傳回非受控記憶體中類型的大小。

C# 語言規格

如需更多資訊,請參閱 C# 語言規範 sizeof 運算子 章節。

另請參閱