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 ) 的结果,后者返回非托管内存中类型的大小。


兔子码农
4 声望1 粉丝

一个酒晕子