我在Intel计算机(Win7 64位)上运行,并且据我了解,Intel正在使用Little-Endian。我使用以下代码在C#中进行了尝试:

byte[] b2 = new byte[] { 0, 1 };
short b2short = BitConverter.ToInt16(b2, 0);

和b2short == 256,这是Little-Endian所期望的。

然后,我读到在.NET中,BitConverter.IsLittleEndian应该反射(reflect)系统正在使用的字节序,并且当我在Visual Studio中检查变量时,它报告为false,即不是Little-Endian。

这与64位操作系统有关吗?有任何想法吗?

编辑:
我对面的同事进行了相同的测试(Win Vista 32位),并且得到了相同的结果

编辑2:
这真的很奇怪。每当我运行代码,并在BitConverter完成其工作后中断,IsLittleEndian == false。
但是,如果我添加以下行Console.WriteLine(BitConverter.IsLittleEndian);之后,它是真的:
byte[] b2 = new byte[] { 0, 1 };
short b2short = BitConverter.ToInt16(b2, 0);
Console.WriteLine(BitConverter.IsLittleEndian);
// Now the IsLittleEndian is true

但是,一旦我删除了Console.WriteLine,它就会再次为假。

我还可以添加,即使我在“Console.WriteLine” IsLittleEndian == true处中断,但是如果我完全删除该行,它就是false。

编辑3:
正如Mark Gravell指出的那样,这一定是一些计时错误。如果我使用变量BitConverter.IsLittleEndian,则将其初始化;如果我不(在中断时查看),则其未初始化,因此为假...

最佳答案

我想知道这是否是一个计时错误,也许与“beforefieldinit”有关……您如何看待这个值(value)? VS调试器可能会触发类型初始化器(用于BitConverter)(可以这么说)。特别是因为false是字段的默认值...
IsLittleEndian静态字段是在静态构造函数中设置的;初始化程序执行的时间很难预测。如果您使用的是调试器,则所有选择都将关闭。可靠地检查此字段的值的唯一方法是通过代码(当CLR在需要它的某个时候运行初始化程序时):

bool isLittleEndian = BitConverter.IsLittleEndian;

不要相信调试器/监视窗口等。

关于c# - 是LittleEndian字段报告错误,但必须是Little-Endian吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2023672/

10-11 01:04