2008-12-10 21 views
5

¿Es una cadena en realidad una matriz de caracteres (is-a), o tiene una matriz de caracteres como una memoria interna (has-a), o es su propio objeto el que puede exponerse como una matriz de caracteres?¿Qué son realmente las cadenas en .NET?

Estoy más inclinado a decir que es su propio objeto, pero ¿por qué nos inclinamos a decir siempre "Una cadena es una serie de caracteres ..."?

+0

¿Por qué lo preguntas? ¿Curiosidad? ¿Algún problema con tu cara? –

+0

Un pedacito mágico de cyber-twine sumergido en una serie de caracteres gooy. – Echostorm

+0

Por favor, edite la pregunta para mencionar .NET en algún lugar. Respondí basado en la etiqueta de pregunta. –

Respuesta

7

la cadena .NET no es solo una matriz de caracteres. Contiene una matriz de caracteres, por lo que, estrictamente hablando, es has-a.

Además, hay muchas sutilezas relacionadas con Unicode en las que no se comporta como una matriz. Concatenar un personaje puede hacer mucho más que simplemente aumentar la longitud de la secuencia en uno, e insertar el nuevo carácter al final. De acuerdo con las reglas de normalización de Unicode, en realidad puede cambiar toda la cadena.Entonces es definitivamente nada como una matriz de caracteres, pero en algún lugar dentro de la clase, existe una matriz de este tipo.

1

MSDN: El tipo de cadena representa una cadena de caracteres Unicode.

Esto significa: es una matriz de caracteres Unicode.

+0

¡Maldito, 44 ​​segundos! = P –

+0

¿Qué tipo de definición utiliza el término que se define en la definición en sí? :) –

+0

La primera cadena es el nombre de la palabra clave, la segunda significa "cadena" como un término general :) –

3

El significado semántico de la cadena es el segundo.

La clase .Net String mantiene una tienda interna (has-a) y puede exponer esa tienda en tantas formas abstractas como los diseñadores elijan.

La pregunta es como "¿Es una manzana redonda de color rojo? Porque siempre pensé que era una fruta".

0

De una manera abstracta (y supongo, cuando se presenta en la memoria): es una matriz de caracteres.

Corrígeme, si me equivoco al pensar eso.

7

Depende de su definición de la palabra "cadena".

System.String tipo en .NET tiene una matriz de caracteres como almacén interno (también almacena la longitud (que es O (1)), entre otras cosas, por ejemplo).

Pero la cadena de palabras significa una ocurrencia consecutiva de algo en general, que también podría significar una matriz de caracteres :))

Por cierto, cuando dicho string tipo tiene una "matriz de caracteres," Yo no t significa "un campo del tipo char[]" específicamente. Quise decir el significado general del término "conjunto" como una colección ordenada de algo. :))

0

Cadena es el nombre de una clase. Tiene diferentes significados en diferentes idiomas. Podría ser unicode o ASCII internamente, lo que significa que su mecanismo de almacenamiento es una serie de bytes. Esta clase proporciona funciones para manipular su propio almacenamiento interno y no se debe acceder y modificar directamente debido a que podría contener caracteres en una variedad de codificaciones diferentes. Entonces, para el propósito de su pregunta, tiene una tienda de bytes.

0

Depende del idioma y la implementación. En el nivel más básico (cadena ascii *) es una serie secuencial de direcciones de memoria, cada una de las cuales contiene un int corto que corresponde a un código ascii y termina con null (char (0)). La mayoría de los lenguajes de nivel superior proporcionan un objeto de cadena que tiene una matriz de caracteres, así como métodos de conveniencia porque trabajar con cadenas * es más o menos un problema en la parte posterior.

+0

Si lee la pregunta y realmente quiere decir que depende del idioma ".Net", entonces está equivocado ... no ... Todas las cadenas .net, independientemente del idioma, son las mismas, tal como lo define el. Sistema de tipo común de red (CTS) ... –

0

Depende de cómo lo mires exactamente. Si lo pinchas con un GCHandle y luego observas la memoria donde reside, verás que en realidad es un descriptor de longitud de 32 bits seguido inmediatamente por una matriz de caracteres Unicode (ten en cuenta que AddrOfPinnedObject te dará la dirección del primer carácter, no la longitud. Si daba la dirección de la longitud, sería mucho menos útil para P/Invocar).

0

Funcionalmente, una cadena es una lista o secuencia de caracteres. Las cadenas a menudo se almacenan de forma transparente como matrices de caracteres (por ejemplo, en C), por lo que a menudo nos referimos a ellas de esa manera. Las matrices permiten el acceso aleatorio conveniente a los caracteres, lo cual es importante para algunos algoritmos.

Para otros fines, almacenar cadenas Unicode como UTF-8 podría ser la forma más adecuada. Tenga en cuenta que, aunque está almacenado en una matriz de bytes, ya no existe una correspondencia uno a uno entre los bytes y los caracteres: sus algoritmos de cadena generalmente necesitan acceder a los caracteres secuencialmente desde el principio, como una lista.

La moraleja de esta historia es: su código de cadena solo debería exigir acceso aleatorio si realmente lo necesita. Puede que se sorprenda de lo poco que realmente necesita una variedad de personajes.

Cuestiones relacionadas