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
的引數可以包含指標類型和受控類型,包括未約束的類型參數。 範例包括 object
和 string
。
下列範例示範 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 運算子 章節。
另請參閱
- C# 運算符和表示式
- 指標相關運算子
- 指標類型
- 記憶體和跨度相關類型
- .NET 中的 泛型