IsLittleEndian字段报告错误,但它一定是Little-Endian?

我在英特尔计算机(Win7 64位)上运行,根据我读到的英特尔正在使用Little-Endian。 我在C#中尝试使用以下代码:

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

和Little-Endian预期的b2short == 256。

然后我在.NET中读到,BitConverter.IsLittleEndian应该反映系统正在使用的endian,当我在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”有关……你怎么看价值? 类型初始化器(对于BitConverter )可能没有被VS调试器触发(可以说是在封面下偷看)。 特别是因为false是字段的默认值…

IsLittleEndian静态字段在静态构造函数中设置; 和初始化程序执行的时间……很难预测。 如果您使用的是调试器,则所有投注均已关闭。 可靠地检查该字段值的唯一方法是通过代码(当CLR在需要之前的某个时刻运行初始化程序时):

 bool isLittleEndian = BitConverter.IsLittleEndian; 

不要相信调试器/观察窗等。

Raymond Chen给出了问题的扩展答案 。

它的要点是:

从调试器中读取成员不会执行代码来初始化该成员。

因此,当您查看Visual Studio中的字段时,它将报告false,因为静态初始化程序尚未运行。 但是,如果在代码中使用该字段,则静态初始化程序运行,从而使该字段返回实际的正确值。

你好吗?

例如,运行这个简短的控制台应用程序:

 using System; public class Test { static void Main() { Console.WriteLine(BitConverter.IsLittleEndian); } } 

这打印什么? 您能详细介绍一下您使用的硬件和操作系统吗?

就像马克说的那样,它似乎是一个时间错误。 使用VS调试器在启动时“查看”它,它返回false,但如果我在消息框中打印它,则返回true。