我在英特尔计算机(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 ......
答案 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)