Boolean - это два байта в .NET? - программирование

Boolean - это два байта в .NET?

Этот вопрос возникает из здесь. Я попробовал это утверждение в VS, чтобы узнать, что произойдет:

Len(Name <= 3)

В соответствии с этим ответом, а также этот, Boolean должен потреблять 4 байта. Согласно MSDN, Функция Len в VB

Возвращает целое число, содержащее либо количество символов в строка или номинальное количество байтов, необходимых для хранения переменной.

Name <= 3 должен преобразовать 3 в String и выполнить сравнение строк, возвращая логическое значение, поэтому Len должно оценивать количество байтов в нем, которое должно быть 4. По какой-то причине выше код возвращает 2, независимо от того, второй параметр. Другими словами, Len(True) также возвращает 2. Пробовал для разных целей платформы (32 и 64) - то же самое.

Почему Len(Boolean) возвращает 2 вместо 4?

4b9b3361

Ответ 1

С пользовательскими типами и объектными переменными функция Len возвращает размер, поскольку он будет записан в файл с помощью функции FilePut. Если объект содержит строку, он вернет длину строки. Если объект содержит любой другой тип, он возвращает размер объекта, поскольку он будет записан в файл с помощью функции FilePut.

Len() является устаревшей функцией, ее следует использовать только в коде, который был перенесен из предыдущих проектов Visual Basic. Там, где он обычно появляется в коде, который включает двоичную сериализацию значений VB. В этих старых версиях размеры базовых типов были разными. Integer составлял 16 бит, например, объясняя большое количество объявлений с плохим пинвиком, которые вы найдете в Интернете, которые используют Long. И Boolean был VARIANT_BOOL под капотом, 16-битным значением. Кроме того, quirky, имея значение True, преобразуется в -1 вместо 1.

Очевидно, что принятие размеров .NET было бы сильно нарушением многих данных, которые существуют в файлах, написанных программой VB6. Или двоичные данные, отправленные через TCP-соединение. Etcetera. Соответственно, функция Len() возвращает прежние размеры.

Ответ 2

В соответствии с MSDN Краткое описание типа данных (VS2012) размер логического значения зависит от платформы реализации. Однако, если вы посмотрите на на той же странице для VS2003, он говорит, что Boolean - это 2 байта.

Раздел III.1.1.1 ECMA-335 гласит:

Учетный стек содержит только 4- или 8-байтовые целые числа, но другие местоположения (аргументы, локальные переменные, статика, элементы массива, поля) могут содержать 1 - или 2-байтовые целые числа. Для операций стека bool (§III.1.1.2) и charтипы рассматриваются как неподписанные 1-байтовые и 2-байтовые целые числа соответственно. Загрузка с эти местоположения в стек конвертируют их в 4-байтовые значения

В разделе III.1.1.2 говорится:

Булевой тип CLI занимает 1 байт в памяти. Битовая диаграмма всех нулей обозначает значение false. Битовая диаграмма с любым одним или несколькими установленными битами (аналогично ненулевому целому числу) обозначает значение true. Для операций стека логические значения обрабатываются как беззнаковые 1-байтовые целые числа


Итак, учитывая, что я чувствую себя только более смущенным, почему вы получаете 2, а не 1