Marshal.Sizeof和BitConverter.GetBytes在布尔值上的行为不同

Reg*_*lez 2 c# boolean sizeof bitconverter

让我们考虑这段代码:

static void Main(string[] args)
{
    Console.WriteLine(Marshal.SizeOf(typeof(bool)));
    Console.WriteLine(String.Join(", ", BitConverter.GetBytes(true)));
}
Run Code Online (Sandbox Code Playgroud)

如果bool是1个字节,我希望它输出

1
1

如果bool是4个字节(作为一个int),我期望

4
1,0,0,0 //让我们忘记字节序

但是,它输出(在x64中)

4
1

在封送代码中,这对我来说是个大问题。我应该信任谁?

请注意,GetBytes将布尔值作为输入: 在此处输入图片说明

can*_*on7 5

两种测量a大小的方法bool都是有缺陷的。

Marshal.SizeOf用于确定将给定类型编组到非托管代码时占用了多少内存。A bool被编组BOOL为4个字节的Windows 类型。

BitConverter.GetBytes(bool) 这样有效地实现:

public static byte[] GetBytes(bool value) {
    byte[] r = new byte[1];
    r[0] = (value ? (byte)1 : (byte)0 );
    return r;
}
Run Code Online (Sandbox Code Playgroud)

来源

因此,它总是返回一个单元素数组。

您可能想要的是sizeof(byte),它“返回给定类型的变量所占用的字节数”(MSDN)。sizeof(bool)返回1

  • 这没有解释的一件事就是为什么`Marshal.SizeOf(typeof(char))`返回1,这使我想知道如何将2字节的UTF16字符编组到一个字节中而不会造成数据丢失的可能... (2认同)