Marshal.Sizeof 和 BitConverter.GetBytes 在布尔值上的表现不同

Marshal.Sizeof and BitConverter.GetBytes behave differently on booleans

让我们考虑这段代码:

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

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

1
1

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

4
1, 0, 0, 0 // let's forget about the endianness

但是,它输出(在 x64 中)

4
1

这对我来说是编组代码中的一个大问题。我应该相信谁?

请注意 GetBytes 将布尔值作为输入:

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

Marshal.SizeOf 用于确定将给定类型编组为非托管代码时占用的内存量。 bool 被编组为 windows BOOL 类型,即 4 个字节。

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

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

Source.

因此它总是returns一个单元素数组。

您可能想要的是 sizeof(byte),即 "returns the number of bytes occupied by a variable of a given type" (MSDN)。 sizeof(bool) returns 1.

这里的情况是 Marshal.SizeOf returns unmanaged 类型的大小(以字节为单位)和 unmanaged 等效布尔值是 4 字节 Win32 BOOL类型。有关详细信息,请参阅