Поле IsLittleEndian сообщает false, но оно должно быть Little-Endian?
Im работает на компьютере Intel (Win7 64-bit), и в соответствии с тем, что я читаю, Intel использует Little-Endian. Я пробую это в С# со следующим кодом:
byte[] b2 = new byte[] { 0, 1 };
short b2short = BitConverter.ToInt16(b2, 0);
и b2short == 256, как и ожидалось от Little-Endian.
Затем я прочитал, что в .NET BitConverter.IsLittleEndian должен отражать, какой endian использует система, и когда я проверяю переменную в Visual Studio, она сообщает false, то есть это НЕ Маленькая- Endian.
Это имеет какое-либо отношение к 64-битной ОС? Любые идеи?
EDIT:
Мой коллеж, который сидит напротив меня, сделал тот же тест (Win Vista 32-бит) и получил те же результаты
ИЗМЕНИТЬ 2:
Это ДЕЙСТВИТЕЛЬНО странно. Всякий раз, когда я запускаю код и ломаюсь после того, как битконвертер сделал свое дело, 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:
Как отметил Марк Гравелл, это должно быть некоторая временная ошибка. Если я использую переменную BitConverter.IsLittleEndian, она инициализируется, если я не (и смотрю на нее при разрыве), ее не инициализируется и, следовательно, false...
Ответы
Ответ 1
Интересно, если это ошибка времени, возможно, связанная с "beforefieldinit"... как вы смотрите на ценность? Возможно, что инициализатор типа (для BitConverter
) не запускается отладчиком VS (который, так сказать, просматривает под обложками). Тем более, что false
является значением по умолчанию для поля...
Статическое поле IsLittleEndian
устанавливается в статическом конструкторе; и время, которое выполняет инициализатор,... очень сложно предсказать. Если вы используете отладчик, все ставки отключены. Единственный способ надежно проверить значение этого поля - через код (когда CLR будет запускать инициализатор в какой-то момент, прежде чем он понадобится):
bool isLittleEndian = BitConverter.IsLittleEndian;
Не доверяйте окнам отладчика/просмотра и т.д.
Ответ 2
Раймонд Чен дает расширенный ответ на вопрос.
Суть его в том, что:
Чтение члена из отладчика не выполняет код для инициализации этого элемента.
Поэтому, когда вы смотрите на поле в Visual Studio, он будет сообщать об ошибке, потому что статический инициализатор еще не запущен. Однако, если вы используете поле в коде, запускается статический инициализатор, заставляя поле возвращать действительное правильное значение.
Ответ 3
Как вы его проверяете?
Например, запустите это короткое консольное приложение:
using System;
public class Test
{
static void Main()
{
Console.WriteLine(BitConverter.IsLittleEndian);
}
}
Что это значит? Не могли бы вы рассказать о том, какое оборудование и ОС вы используете?
Ответ 4
Как и Марк, похоже, что это ошибка времени. Используя отладчик VS для "заглядывания" при значении при запуске, он возвращает false, но если я его распечатаю в окне сообщений, он вернет true.