2012-02-17 11 views
22

Sé que las cadenas tienen una longitud variable, por lo tanto, necesitan espacio variable en la memoria para ser almacenadas. Cuando definimos un elemento de cadena en struct, el tamaño de struct sería de longitud variable.C# gestión de cadenas en las estructuras

Los idiomas antiguos lo lograron mediante el uso de cadenas de longitud fija. Sin embargo, no hay forma de definir cadenas de longitud fija en C#, y C# maneja cadenas normales en struct s bastante bien.

Esto se vuelve más extraño cuando definimos una matriz de tales struct s, o simplemente una matriz de cadenas. Como resultado de cualquier cambio (disminución/aumento) en la longitud de una secuencia, todos los struct s hacia adelante se deben desplazar.

¿Cómo maneja C# las cadenas de longitud variable en las estructuras?

+2

C# no es C: asume que la memoria se gestiona de la misma manera en ambos. – Oded

+0

Sí ... Mi culpa. –

Respuesta

37

Una referencia a la cadena (que no es un tipo de valor) se almacena en la estructura, por lo que el tamaño de la estructura nunca cambia.

+1

+1 ¡Muy concisa! – Candide

+0

¿Querías decir "Es un tipo de valor"? – Krythic

+0

No, una cadena no es un [tipo de valor] (https://msdn.microsoft.com/en-us/library/s1ax56ch.aspx). – jjlin

5

+1 a jjlin para una respuesta concisa y exacta a la pregunta, pero una respuesta más general puede ser útil:

un campo o una declaración de variables de cualquier el tipo de referencia representa una ubicación de almacenamiento para la referencia. Esto también es cierto para los campos de una estructura.

(incluidos los campos de tipo de referencia en una estructura que hace que un tipo de "tipo administrado", lo cual es importante en el código no seguro, no se puede declarar un puntero a un tipo administrado.)

9

Mi primera pregunta lo estarías, ¿tus requisitos dictan que se necesita una cadena de longitud fija? Si es así, un char [] podría ser lo que intentas usar.

El .NET Framework no utiliza cadenas de estilo C (matrices de caracteres) directamente, sino que representa cadenas mediante referencias inmutables. Cuando se agrega o modifica una cadena, en realidad está creando un nuevo objeto de cadena en la memoria. Esta es una característica deseada de la plataforma, pero una que requiere consideración, ya que se espera que el cambio de tamaño mágico de las cuerdas pueda ocasionar algunos efectos secundarios no deseados.

Volver a tu pregunta. "¿Cómo gestiona C# las cadenas en las estructuras?"

Una de las dos formas de interpretar esta pregunta por lo que veo:

1). ¿Cómo puedo crear estructuras que contengan cadenas y cómo gestiona .NET Framework las cadenas en este escenario?

Respuesta corta: tenga en cuenta que las cadenas son tipos inmutables. Crea tu estructura normalmente, y date cuenta de que la estructura solo contiene una referencia a la cadena, no un segmento mágico de redimensionamiento de la estructura que se expande para incluir tu cadena volátil.

2). ¿Cómo puede .NET Framework cambiar el tamaño de las cadenas si son un tipo de valor representado por estructuras?

Respuesta corta, no es así. Esto no es comoNET funciona con cadenas, ver arriba.

+1

Gracias Firoso. No, estoy feliz con las cuerdas. Solo me preocupaba la gran complejidad de las operaciones en el tiempo sobre las estructuras y las matrices de cadenas. Ahora sé el truco: "referencia a la cadena". –

+0

Si le preocupa la eficacia de la manipulación y la mutación fuertes, considere usar la clase StringBuilder. – Firoso

-5

Estructura de guardar en la pila y la cadena almacena en el montón.

Igual que los tipos primitivos guarda en la pila y los tipos de referencia guardan en el montón.