Подтвердить что ты не робот

Поле 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...

4b9b3361

Ответ 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.