sizeof 运算符 - 确定给定类型的内存需求

sizeof 运算符返回给定类型的变量占用的字节数。 在安全代码中,运算符的参数 sizeof 必须是内置 非托管类型的名称。

下表中显示的表达式在编译时计算为相应的常量值,不需要不安全的上下文:

表达式 常量值
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 如下所示:

  • 约束为非托管类型的类型参数在运行时返回该非托管类型的大小。
  • 托管类型或指针类型返回引用或指针的大小,而不是它引用的对象的大小。

以下示例演示了 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 运算符返回托管内存中公共语言运行时分配的字节数。 对于 结构 类型,该值包括任何填充,如前面的示例所示。 sizeof 运算符的结果可能与 Marshal.SizeOf 方法的结果不同,该方法返回非托管 内存 中类型的大小。

重要

sizeof 返回的值可能与 Marshal.SizeOf(Object)的结果不同,后者返回非托管内存中类型的大小。

C# 语言规范

有关详细信息,请参阅 C# 语言规范sizeof 运算符部分。

另请参阅