IsLittleEndian字段报告错误,但它必须是Little-Endian?

时间:2010-01-07 21:05:56

标签: c# windows-7

我在英特尔计算机(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 ,即它不是 - 端的。

这与64位操作系统有什么关系吗?有什么想法吗?


编辑: 我的同事坐在我对面,做了同样的测试(Win Vista 32位)并得到了相同的结果


编辑2: 这真的很奇怪。每当我运行代码,并在BitConverter完成它之后中断,IsLittleEndian == false。 但是,如果我添加行 Console.WriteLine(BitConverter.IsLittleEndian); 之后它为TRUE:

byte[] b2 = new byte[] { 0, 1 };
short b2short = BitConverter.ToInt16(b2, 0);
Console.WriteLine(BitConverter.IsLittleEndian);
// Now the IsLittleEndian is true

但是一旦我删除了Console.WriteLine,它再次 false

我还可以补充一点,即使我在“Console.WriteLine”中断了IsLittleEndian == true,但如果我完全删除该行则为false。


编辑3: 正如Mark Gravell指出的那样,这肯定是一些时间错误。如果我使用变量BitConverter.IsLittleEndian它是初始化的,如果我不(并在破坏时查看)它未初始化,因此 false ......

4 个答案:

答案 0 :(得分:20)

我想知道这是否是一个时间错误,可能与“beforefieldinit”有关......你怎么看价值?类型初始值设定项(对于BitConverter)可能没有被VS调试器触发(可以说是在封面下偷看)。特别是因为false是字段的默认值...

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

bool isLittleEndian = BitConverter.IsLittleEndian;

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

答案 1 :(得分:6)

Raymond Chen对问题here(镜像,更好的格式here)给出了扩展答案。

它的要点是:

  

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

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

答案 2 :(得分:2)

你是如何检查的?

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

using System;

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

那是什么印刷品?你能详细介绍一下你正在使用的硬件和操作系统吗?

答案 3 :(得分:0)

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