sizeof 运算符返回给定类型的变量占用的字节数。在非 unsafe 代码中,sizeof 运算符的参数必须是 unmanaged 类型的名称,或是被 constrained(约束)为 unmanaged 类型的类型参数。unmanaged 类型包括所有数值类型、enum 类型和 tuple(元组)和 struct(结构)类型,其中所有成员都是 unmanaged 类型。
下表中显示的表达式在编译时计算为相应的常量值,不需要 unsafe 的上下文:
表达式 | 常量值 |
---|---|
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 |
在 unsafe 代码中,sizeof 的实参可以包括指针类型和 managed(托管)类型,包括不受约束的类型参数。例子包括 object 和 string。
下面的例子演示了 sizeof 操作符的用法(使用此例子,需要在菜单“项目”→“工程 和属性”→“生成”→“常规”中选定“不安全代码”中的“允许使用“unsafe”关键字编译的代码。”一项):
public struct Dian
{
public Dian ( byte tag , double x , double y ) => ( Tag , X , Y ) = ( tag , x , y );
public byte Tag { get; }
public double X { get; }
public double Y { get; }
}
internal class Program
{
static void Main(string[] args)
{
Console . WriteLine ( sizeof ( byte ) ); // 输出:1
Console . WriteLine ( sizeof ( double ) ); // 输出:8
DisplaySizeOf < Dian > ( ); // 输出:Dian 类型的大小:24
DisplaySizeOf < decimal > ( ); // 输出:System . Decimal 类型的大小:16
unsafe
{
Console . WriteLine ( sizeof ( Point* ) ); // 输出:8
}
}
static unsafe void DisplaySizeOf < T > ( ) where T : unmanaged
{
Console . WriteLine ( $"{typeof ( T )} 类型的大小:{sizeof ( T )}" );
}
}
sizeof 运算符返回公共语言运行库(CLR)在托管内存中分配的字节数。对于结构类型,该值包括任何填充,如前面的示例所示。sizeof 操作符的结果可能与 Marshal . SizeOf 方法的结果不同,该方法返回非托管内存中类型的大小。
在 unsafe 代码中,当参数是托管类型时,sizeof 操作符返回引用的大小,而不是为该类型的实例分配的字节数。
重要的:sizeof 返回的值可能不同于 Marshal . SizeOf ( Object ) 的结果,后者返回非托管内存中类型的大小。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。