共用方式為


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

sizeof 運算符會傳回指定類型變數所佔用的位元組數目。 在安全程式代碼中,sizeof 運算子的自變數必須是非受控型別 的名稱,或是 限制 為 Unmanaged 型別的類型參數。 Unmanaged 類型包含所有數值類型、列舉類型,以及所有成員都是 Unmanaged 類型的元組和結構類型。

下表中顯示的運算式會在編譯時評估為對應的常數值,而且不需要不安全的環境:

表達 常數值
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

在不安全的程式碼中,sizeof 的引數可以包含指標類型和受控類型,包括未約束的類型參數。 範例包括 objectstring

下列範例示範 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
        }
    }

    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 方法的結果不同,此方法會傳回非受控 記憶體 類型的大小。

在不安全的程式代碼中,當自變數是 Managed 型別時,sizeof 運算符會傳回參考的大小,而不是為該類型的實例配置的位元元組數目。

重要

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

C# 語言規格

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

另請參閱