让我们考虑一下这段代码:
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
这对我来说在编码代码中是一个很大的问题。我应该信任谁?
最佳答案
两种测量 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 .
因此它总是返回一个单元素数组。
您可能需要的是 sizeof(byte)
,它“返回给定类型的变量占用的字节数”( MSDN )。 sizeof(bool)
返回 1
。
关于c# - Marshal.Sizeof 和 BitConverter.GetBytes 对 boolean 值的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58322746/