2010-06-01 9 views
6

Supongo que tiene que hacer algo con string siendo un tipo de referencia, pero no entiendo por qué simplemente string.Replace("X","Y") no funciona?¿Por qué string.Replace ("X", "Y") funciona solo cuando se asigna a una nueva cadena?

¿Por qué tengo que hacer string A = stringB.Replace("X","Y")? Pensé que es solo un método para hacer en una instancia especificada.

EDIT: Gracias hasta ahora. Extiendo mi pregunta: ¿Por qué funciona b+="FFF" pero b.Replace no?

Respuesta

0

String.Replace es una función compartida de la clase de cadena que devuelve una nueva cadena. No es un operador en el objeto actual. b.Replace ("a", "b") sería similar a una línea que solo tiene c + 1. Así que al igual que c = c + 1 en realidad establece el valor de c + 1 a c, b = b.Replace ("a", "b") establece la nueva cadena devuelta a b.

+3

La razón subyacente de esto es porque las cadenas son inmutables, es decir, no se pueden cambiar. Consulte la respuesta de @Kevin. Para mí es un error en Microsofts, ya que el nombre del método es engañoso. – James

+0

¿Qué quiere decir con una "Cadena".Reemplazar es una función compartida "y" no es un operador en el objeto actual "? –

+0

@James, las cadenas son inmutables, pero las variables no lo son. El OP parece querer saber por qué el valor de la variable no es cambiado, pero es la mala convención de nomenclatura lo que causa el problema, no la inmutabilidad de las cadenas. @Mark, pobre redacción de mi parte. Quise decir que actúa como una función compartida, no que sea una. Y como una referencia tipo, actúa en la cadena referenciada, no en la referencia. –

23

Porque las cadenas son inmutables. Cada vez que cambia una cadena .net crea crea un nuevo objeto de cadena. Es una propiedad de la clase.

Immutable objects
String Object

+0

+1: Esta es la razón definitiva. Sin embargo, yo diría que el problema real es el nombramiento del método. 'Reemplazar 'implica que el objeto real sería manipulado. – James

16

¿Por qué no lo hace stringA.Replace("X","Y") trabajo?
¿Por qué tengo que hacer stringB = stringA.Replace("X","Y");?

Porque las cadenas son inmutables en .NET. No puede cambiar el valor de un objeto de cadena existente, solo puede crear nuevas cadenas. string.Replace crea una nueva cadena que luego puede asignar a algo si desea mantener una referencia a la misma. A partir de la documentación:

devuelve una nueva cadena en la que todas las apariciones de una cadena especificada en la instancia actual se sustituyen con otra cadena especificada.

Énfasis mío.


Así que si las cadenas son inmutables, ¿por qué b + = "FFF"; ¿trabajo?

Buena pregunta.

Primero tenga en cuenta que b += "FFF"; es equivalente a b = b + "FFF"; (excepto que b solo se evalúa una vez).

La expresión b + "FFF" crea una nueva cadena con el resultado correcto sin modificar la cadena anterior. La referencia a la nueva cadena se asigna a b reemplazando la referencia a la cadena anterior. Si no hay otras referencias a la cadena anterior, entonces será elegible para la recolección de basura.

1

Sí, es un método de System.String. Pero puede intentar a = a.Replace ("X", "Y");

3

Las cadenas son inmutables. Cualquier operación que los cambie tiene que crear una nueva cadena.

6

Las cadenas son inmutables, lo que significa que una vez que se crean, ya no se pueden cambiar. Esto tiene varias razones, por lo que sé principalmente para el rendimiento (cómo se representan las cadenas en la memoria).

Ver también (entre muchos):

Como consecuencia directa de ello, cada operación de cadena crea un nuevo objeto de cadena. En particular, si hace cosas como

foreach (string msg in messages) 
{ 
    totalMessage = totalMessage + message; 
    totalMessage = totalMessage + "\n"; 
} 

realmente crea potencialmente docenas o cientos de objetos de cadena. Por lo tanto, si desea manipular cadenas de manera más sofisticada, siga la sugerencia de GvS y use StringBuilder.

2

A StringBuilder admite el método Reemplazar en línea.

Utilice StringBuilder si necesita realizar mucha manipulación de cadenas.

2

Por qué "B + =" obras FFF ", pero el b.replace no es

Debido a que el operador + = asigna los resultados de vuelta al operando de la mano izquierda, por supuesto. Es sólo una mano corta . para b = b + "FFF";

El simple hecho es que no se puede cambiar cualquier cadena en .Net Hay no hay métodos de instancia para cuerdas -. siempre debe asignar los resultados de un operativo de nuevo a una cadena de referencia en alguna parte

+2

¡Hay muchos métodos de instancia en la cadena! http://msdn.microsoft.com/en-us/library/system.string_methods(v=VS.100).aspx Ellos simplemente nunca cambian su instancia. –

0

Como todo el mundo ha dicho, las cadenas son inmutables.

Esto significa que cuando reemplazas, obtienes una nueva cadena, en lugar de cambiar la cadena existente.

Si no almacena esta nueva cadena en una variable (como en la variable que fue declarada como) su nueva cadena no se guardará en ninguna parte.

0

Para responder a su pregunta extendida, b + = "FFF" es equivalente a b = b + "FFF", por lo que básicamente está creando una nueva cadena aquí también.

0

Solo para ser más explícito. string.Replace ("X", "Y") devuelve una nueva cadena ... pero como no está asignando la nueva cadena a nada, la nueva cadena se pierde.

Cuestiones relacionadas