.net - true - public bool c#
Booleano es de dos bytes en.NET? (2)
Esta pregunta se origina desde here . Intenté esta declaración en VS para ver qué pasa:
Len(Name <= 3)
De acuerdo con esta respuesta y también con esta , Boolean debería consumir 4 bytes. Según MSDN, la función de Len en VB
Devuelve un entero que contiene el número de caracteres en una cadena o el número nominal de bytes necesarios para almacenar una variable.
Name <= 3
debe convertir 3 en Cadena y realizar una comparación de cadena, devolviendo un valor booleano, por lo que Len
debe evaluar el número de bytes en él, que debe ser 4. Por alguna razón, el código anterior devuelve 2, independientemente del segundo parámetro. En otras palabras, Len(True)
también devuelve 2. Probado para diferentes objetivos de plataforma (32 y 64): lo mismo.
¿Por qué Len(Boolean)
devuelve 2 en lugar de 4?
Con los tipos definidos por el usuario y las variables de Objeto, la función Len devuelve el tamaño tal como será escrito en el archivo por la función FilePut. Si un objeto contiene una cadena, devolverá la longitud de la cadena. Si un objeto contiene cualquier otro tipo, devolverá el tamaño del objeto tal como lo escribirá el archivo mediante la función FilePut.
Len () es una función heredada, solo debe usarse en código que se haya portado de proyectos de Visual Basic de la generación anterior. Donde normalmente aparecería en el código que involucraba la serialización binaria de valores de VB. Los tamaños de los tipos básicos eran diferentes en esas versiones antiguas. Integer
fue de 16 bits, por ejemplo, explicando la gran cantidad de declaraciones de pinvoke incorrectas que encuentra en la web que usan Long. Y Boolean
era un VARIANT_BOOL bajo el capó, un valor de 16 bits. Además, peculiar por tener su valor True
convertido a -1 en lugar de 1.
Claramente, la adopción de los tamaños de .NET habría sido un gran cambio en la gran cantidad de datos que existen en archivos escritos por un programa VB6. O datos binarios enviados a través de una conexión TCP. Etcétera. En consecuencia, la función Len () devuelve los tamaños heredados.
De acuerdo con el Resumen de tipos de datos de MSDN (VS2012), el tamaño de Boolean depende de la plataforma de implementación. Sin embargo, si nos fijamos en la misma página para VS2003, se dice que Boolean es de 2 bytes.
ECMA-335 sección III.1.1.1 establece:
La pila de evaluación solo contiene enteros de 4 u 8 bytes, pero otras ubicaciones (argumentos, variables locales, estadísticas, elementos de matriz, campos) pueden contener enteros de 1 o 2 bytes. A los efectos de las operaciones de pila, los tipos bool (§III.1.1.2) y char se tratan como enteros de 1 byte y de 2 bytes sin signo respectivamente. La carga desde estas ubicaciones en la pila los convierte a valores de 4 bytes
Y la sección III.1.1.2 establece:
Un tipo booleano CLI ocupa 1 byte en la memoria. Un patrón de bits de todos los ceros denota un valor de falso. Un patrón de bits con uno o más bits establecidos (análogo a un entero que no es cero) denota un valor de verdadero. A los efectos de las operaciones de pila, los valores booleanos se tratan como enteros de 1 byte sin signo.
Así que dado eso, me siento más confundido en cuanto a por qué obtienes 2 y no 1