¿Por qué tenemos el tipo 'char' de tamaño = 2Bytes en C# (. Net) a diferencia de 1Byte en otros lenguajes de programación?tamaño del tipo de caracteres en C#
Respuesta
Una char es unicode en C#, por lo tanto, el número de caracteres posibles excede 255. Por lo tanto, necesitará dos bytes.
El ASCII extendido, por ejemplo, tiene un juego de 255 caracteres y, por lo tanto, se puede almacenar en un solo byte. Ese es también el propósito del espacio de nombre System.Encoding
, ya que los diferentes sistemas pueden tener diferentes conjuntos de caracteres y tamaños de caracteres. C# por lo tanto puede manejar one/four/etc. char bytes, pero Unicode UTF-16 es el predeterminado.
Con Unicode como código de 21 bits es un un poco exagerado para decir que es por eso que necesita dos bytes. – Joey
Los charactores se representan utilizando UTF-16, lo que significa que cada carácter utiliza al menos 16 bits o 2 bytes (incluso los caracteres de ASCII que solo requieren 7 bits). Si el valor Unicode es lo suficientemente grande, un único carácter que se imprimiría en la pantalla realmente requerirá dos 'char's. – Cemafor
La primera oración de esta respuesta ignora la existencia de caracteres de ancho variable. – kervin
Porque las cadenas en .NET están codificadas como caracteres de Unicode de 2 bytes.
(a) Las cadenas son secuencias de caracteres. (b) No hay caracteres Unicode de 2 bytes. Puede estar buscando los términos * unidad de código * y * código de punto *. Y con este último, todavía no hay 16 bits, solo 21. – Joey
UTF-8/16/32! = Unicode – Lucas
Entonces, ¿cuál es la relación entre un carácter C# y un punto de código Unicode? – JohnM2
En realidad, C#, o más exactamente el CLR, el tamaño del carácter es coherente con la mayoría de los demás lenguajes administrados. Los lenguajes administrados, como Java, tienden a ser más nuevos y tienen elementos como el soporte Unicode integrado desde cero. La extensión natural de las cadenas Unicode compatibles es tener caracteres Unicode.
Los lenguajes antiguos como C/C++ comenzaron solo en ASCII y solo más tarde agregaron compatibilidad Unicode.
supongo con “otros lenguajes de programación” que significaría C. C tiene en realidad dos diferentes tipos: char
char
y wchar_t
. char
puede ser de un byte de longitud, wchar_t
no necesariamente.
En C# (y .NET) para el caso, todas las cadenas de caracteres están codificadas como Unicode en UTF-16. Es por eso que char
en .NET representa una sola unidad de código UTF-16 que puede ser un punto de código o la mitad de un par suplente (en realidad no es un personaje, entonces).
Referencia: https://docs.microsoft.com/en-us/dotnet/api/system.char?view=netframework-4.7 –
Porque un carácter en una cadena C# se establece de manera predeterminada en la codificación UTF-16 de Unicode, que es de 2 bytes (de forma predeterminada).
C# utilizando un ancho de caracteres de 16 bits probablemente tiene más que ver con el rendimiento que con cualquier otra cosa.
En primer lugar, si utiliza UTF-8 puede incluir todos los caracteres en la cantidad de espacio "correcta". Esto se debe a que UTF-8 es de ancho variable. Los caracteres ASCII usarán 8 bits, mientras que los caracteres más grandes usarán más.
Pero la codificación de caracteres de longitud variable alienta O (n) complejidad del algoritmo en escenarios comunes. P.ej. Recuperando un personaje en una ubicación particular en una cadena. Ha habido discusiones públicas sobre este punto. Pero la solución más simple es continuar utilizando un ancho de caracteres que se adapte a la mayoría de su juego de caracteres, truncando los otros. Ahora tiene un ancho de caracteres fijo.
Estrictamente hablando, UTF-16 también es una codificación de ancho variable, por lo que C# (y Java para el caso) están utilizando algo de un híbrido ya que sus anchos de caracteres nunca son de 32 bits.
Yo votaría esto para el primero, segundo y último párrafo; pero lo votaría por el tercer párrafo. Sin embargo, sigue siendo mejor que las otras respuestas, incluida la respuesta principal/aceptada. PD tienes un error tipográfico: "Ahora ** es ** tienes un ancho de caracteres fijo". – hippietrail
@hippietrail Tengo curiosidad, ¿qué pasa con el 3er párrafo que crees que es incorrecto? ¿Puedes obtener un personaje en una ubicación específica en una cadena de caracteres de ancho variable utilizando mejor que O (n)? – kervin
Porque argumenta que la razón era tener codificación de longitud fija en escenarios comunes. Los escenarios legítimos para tratar el texto como longitud fija son pocos. Los comunes son solo juguetes, ignorantes y miopes que inevitablemente conducen a errores. Los desarrolladores de C# no solo lo sabían, sino que el desarrollo de C# solo se inició tres años después de que Unicode avanzara más allá de 16 bits y Microsoft fue un miembro clave del consorcio Unicode todo el tiempo. Ahora bien, estos fueron sin duda factores en la decisión de UCS-2 para Java y Windows NT, pero para C# las razones solo pueden haber sido legado y momentum. – hippietrail
- 1. Tamaño de caracteres en Java vs. C
- 2. tamaño de tipo char en C
- 3. Usando C, ¿por qué un tipo de caracteres * sería del tamaño 2 en un lugar, pero 4 en otro?
- 4. Tamaño máximo del tipo de datos "TEXTO" en postgresql
- 5. Tamaño del carácter ('a') en C/C++
- 6. Reducción del tamaño de bitmap en C#
- 7. Tipo de datos de tamaño de bit arbitrario en C#
- 8. Límite de tamaño del tipo de datos JSON en PostgreSQL
- 9. tipo de devolución del constructor en C++
- 10. Obtener el tamaño del puntero en C
- 11. Comparación de caracteres Unicode del objetivo C
- 12. Manipulación del tipo de datos de 80 bits en C
- 13. Cadenas y codificación de caracteres en C++
- 14. Determinación del tamaño del archivo en VB.NET
- 15. ¿cuál es el límite máximo de tamaño del tipo de datos varchar en sqlite?
- 16. Tamaño del bit de Int de GHC Tipo
- 17. C# determinación del tipo genérico
- 18. Por qué Java ha corregido el tamaño del tipo de datos a diferencia de C
- 19. C++: rasgos del tipo has_trivial_X
- 20. Envoltura semántica del tipo C++
- 21. Limitaciones del tipo dinámico en C#
- 22. Unión del mismo tipo en C++
- 23. tamaño de tipo de referencia en java
- 24. C# Regex: ¿Caracteres válidos del grupo nombrado?
- 25. C# llamando a la función C que devuelve struct con arreglo de caracteres de tamaño fijo
- 26. C++ arreglos de tamaño fijo frente a múltiples objetos del mismo tipo
- 27. Sobrecarga de rendimiento del tamaño de clase grande en C#
- 28. tamaño fijo matriz de tipo Estructura
- 29. Determinación del tamaño de una clase polimórfica C++
- 30. C/C++ tamaño de pila máximo del programa
[¿Por qué C# usa UTF-16 para cadenas?] (Http://blog.coverity.com/2014/04/09/why-utf-16/) – hippietrail