2011-08-09 12 views
5

que fue recientemente tratando de hacer lo siguiente en C#System.String subyace aplicación

string str = "u r awesome"; 
str[0]="i"; 

Y no funcionaría porque al parecer str [i] es sólo no conseguir un juego, así que me preguntaba lo la implementación subyacente de la cadena es que obligaría a str [i] a ser solo un get.

¿No es solo una envoltura administrada para un char *? Entonces, ¿por qué no puedo establecer str [i]?

Respuesta

3

las respuestas de los demás dieron en relación con la inmutabilidad son, por supuesto, correcto y son la causa "real" de la cuestión que usted tenga.

ya que preguntas específicamente sobre la implementación subyacente (y si sólo por curiosidad), y como referencia a otros que podrían tropezar con esta pregunta, aquí tienes más información sobre este tema a partir Eric Lippert:

"En .NET CLR, las cadenas se presentan en la memoria más o menos del mismo modo que los BSTR se implementaron en Automatización OLE: como un buffer de memoria alineado por palabras que consiste en un entero de cuatro bytes que da la longitud de , seguido de los caracteres de la cadena en bytes de dos bytes de datos UTF-16, seguidos de dos bytes cero ".

Tenga en cuenta la parte "bonita" aquí, sin embargo BSTR también se explican en Eric's blog.

Tenga en cuenta que todo esto debe considerarse un detalle de implementación. Y a pesar de que en realidad no debería preocuparnos a la mayoría de nosotros, podría ayudar durante la depuración de problemas de interoperabilidad o en la comprensión general.

+0

Esta fue en realidad la respuesta que estaba buscando, específicamente sobre cómo se implementó la cadena, ¡gracias! – etk1220

8

No puede establecer los caracteres de una cadena porque la clase .NET String es inmutable - eso significa que su contenido no se puede cambiar después de haber sido creado. Esto permite que la misma instancia de cadena se use muchas veces de forma segura, sin que un objeto se preocupe de que otro objeto vaya a pisar sus cadenas.

Si necesita una clase mutable que le permita manipular una cadena de caracteres, considere usar StringBuilder en su lugar.

Si quiere comparar con C, el tipo String es como const char *, excepto que no puede deshacerse de la constness. StringBuilder es más como un char * (con cambio automático de tamaño de asignación) y con un método (ToString()) para crear una nueva instancia independiente String de su contenido.

+0

Relacionados: Detalles en las partes internas de StringBuilder http://stackoverflow.com/q/3564906/38206 –

2

Como contestada por cdhowie, que no es lo mismo que el concepto de cadena en C/C++

Si quieres a la anterior, como una sugerencia que puede tratar de imitar la implementación a través de contenedor, como más adelante

List<char> str = new List<char>("u r awesome"); 
str[0] = 'i'; 
str[2] = 'm'; 
Console.WriteLine(str.ToArray()); 
+2

Sería mejor utilizar 'StringBuilder' para esto, ya que su propósito específico es permitir la construcción de cadenas. – cdhowie

+1

totalmente de acuerdo. la sugerencia del código realmente solo es tratar de mostrar cómo etk en una implementación alternativa si realmente quiere manipular el elemento por índice. –

+3

'StringBuilder' tiene [un indexador] (http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.chars.aspx) que permite exactamente eso. :) – cdhowie

Cuestiones relacionadas