2011-06-09 20 views
18

Después de leer What's the rationale for null terminated strings? y algunas preguntas similares, he encontrado que en C# /. Las cadenas de texto son, internamente, con prefijo de longitud y terminan nulo como en BSTR Data Type.¿Por qué las cadenas C# /. Net tienen el prefijo de longitud y el nulo terminado?

¿Cuál es la razón por la cual las cadenas tienen prefijo de longitud y terminan nulo en lugar de, por ejemplo. ¿solo con prefijo de longitud?

+2

Probablemente solo @Eric Lippert pueda responder a este. Hay buenas razones para hacer una u otra (y también compensaciones). Estoy tan sorprendido como tú de que C# hace ** ambos **. – Yuck

+1

@Yuck - O Jon Skeet – Xaisoft

Respuesta

21

Longitud prefijada para que la longitud de cálculo sea O(1).

Nulo terminado para hacer que las referencias se administren sin supervisión rápidamente (lo más probable es que las cadenas sin terminación terminen esperando que no se administren).

4

Lo más probable es que garantice una fácil interoperabilidad con COM.

13

Aquí es un extracto del Blog de Jon Skeet Post acerca de las cadenas:

Aunque las cadenas son no terminada en nulo en lo que se refiere a la API, la matriz de caracteres es terminada en nulo, ya que esto significa que se puede pasar directamente a funciones no administradas sin que se involucre ninguna copia, suponiendo que el interoperativo especifique que la cadena se debe ordenar como Unicode.

0

La mejor suposición es que encontrar la longitud es constante (O (1)) en comparación con atravesarlo, ejecutándose en O (n).

+0

Ese es el razonamiento detrás del prefijo de la cuerda con la longitud. Esa no es una razón para usar adicionalmente un carácter de terminación –

+1

@Daniel Hilgarth: ¿Y por qué no dupliqué las otras respuestas? La pregunta pregunta el razonamiento de ambos lados. – leppie

+1

Lo siento, no entiendo tu comentario, ¿vuelves? Las preguntas preguntan cuál es el razonamiento para usar ** ambos juntos **. Y no es lo que el razonamiento es para uno u otro en sí mismo –

3

Mientras que 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 un montón de cosas que el marco (o programas de usuario) necesita lidiar con eso esperar cadenas terminadas NULL.

Como la API Win32, por ejemplo.

Por lo tanto, es conveniente mantener un terminador NULL al final de los datos de cadena, ya que es probable que tenga que estar allí con bastante frecuencia de todos modos.

Tenga en cuenta que la clase std::string de C++ se implementa de la misma manera (en MSVC de todos modos). Por la misma razón, estoy seguro (c_str() se usa a menudo para pasar un std::string a algo que quiere una cadena estilo C).

Cuestiones relacionadas