活动
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
的参数可以包括指针类型和托管类型,包括无约束的类型参数。 示例包括 object
和 string
。
以下示例演示了 sizeof
运算符的用法:
C#
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
运算符返回引用的大小,而不是为该类型的实例分配的字节数。
重要
sizeof
返回的值可能与 Marshal.SizeOf(Object)的结果不同,后者返回非托管内存中类型的大小。
有关详细信息,请参阅 C# 语言规范的 sizeof 运算符部分。