una - ¿Por qué las cadenas C#/.net tienen un prefijo de longitud y son nulas?
recortar string c# (5)
Después de leer ¿Cuál es la razón para las cadenas terminadas en nulo? y algunas preguntas similares he encontrado que en C # /. Las cadenas de red son, internamente, con prefijo de longitud y terminadas en nulo como en el tipo de datos BSTR .
¿Cuál es la razón por la que las cadenas tienen un prefijo de longitud y están terminadas en nulo en lugar de, por ejemplo? solo prefijo de longitud?
Aquí hay un extracto de la Post del blog de Jon Skeet sobre las cadenas:
Aunque las cadenas no están terminadas en nulo en lo que concierne a la API, la matriz de caracteres está terminada en nulo, ya que esto significa que se puede pasar directamente a funciones no administradas sin ninguna copia implicada, asumiendo que el interoperatorio especifica que la cadena debe ser ordenado como Unicode.
La mejor suposición es que encontrar la longitud es constante (O (1)) en comparación con atravesarla, ejecutándose en O (n).
Lo más probable, para garantizar la interoperabilidad fácil con COM.
Si bien el campo de longitud facilita que el marco determine la longitud de una cadena (y permite que la cadena contenga caracteres con un valor cero), hay una gran cantidad de cosas que el marco (o programas de usuario) necesita para lidiar con eso Cadenas terminadas en NULL.
Como la API de Win32, por ejemplo.
Por lo tanto, es conveniente mantener un terminador NULL al final de los datos de la cadena, ya que es probable que tenga que estar allí a menudo de todos modos.
Tenga en cuenta que la clase std::string
C ++ se implementa de la misma manera (en MSVC de todos modos). Por la misma razón, estoy seguro de que ( c_str()
se usa a menudo para pasar una std::string
a algo que quiere una cadena de estilo C).
Longitud prefijada para que la longitud de cálculo sea O(1)
.
Terminado en nulo para hacer que el cálculo de referencias a llamas no administradas sea más rápido (no administrado probablemente espera cadenas terminadas en nulo).