Pregunta

Lote de preguntas ya se ha preguntado acerca de las diferencias entre la cadena y el constructor de cadena y la mayoría de las personas sugieren que constructor de cadena es más rápida que la cadena. Tengo curiosidad por saber si constructor de cadena es demasiado bueno ¿por qué cadena es allí? Por otra parte, un cuerpo puede darme un ejemplo en cadena será más útil que el constructor de cadena?

¿Fue útil?

Solución

No es un caso de lo que es más útil ...

A String es un String - uno o más caracteres al lado de fuerza. Si quieres Cambio una cadena de alguna manera, se limita a crear más cadenas porque son inmutable .

A StringBuilder es una clase que crea cadenas. Proporciona un medio para construirlos sin crear una gran cantidad de cadenas reduntant en la memoria. El resultado final será siempre un String.

No hacer esto

string s = "my string";
s += " is now a little longer";

o

s = s + " is now longer again";

Eso crearía 5 cadenas en memoria (en realidad, ver más abajo).

Haga lo siguiente:

StringBuilder sb = new StringBuilder();
sb.Append("my string");
sb.Append(" is now a little longer");
sb.Append(" is now longer again");
string s = sb.ToString();

Eso crearía 1 cadena en la memoria (de nuevo, ver más abajo).

Usted puede hacer esto:

string s = "It is now " + DateTime.Now + ".";

Esto sólo crea 1 cadena en la memoria.

Como nota lateral, creando un StringBuilder embargo, toma una cierta cantidad de memoria de todos modos. Como regla empírica:

  • Utilice siempre un StringBuilder si está concatenación de cadenas en un bucle.
  • Utilice un StringBuilder si está concatenar una cadena más de 4 veces.

Otros consejos

StringBuilder es, como su nombre sugiere, se utiliza para construir cuerdas, mientras que las cadenas son inmutables-valores de carácter. Use cuerdas cuando se quiere pasar alrededor de los datos de caracteres, uso de StringBuilder cuando se quiere manipular los datos de carácter.

StringBuilder es una mejor opción en la construcción y modificación de las cadenas pesada a través de bucles o iteraciones.

operaciones de cadenas simples como unos concatenaciones o simplemente almacenar un valor de cadena trajes de un objeto de cadena estándar mucho mejor.

Pregunta similar? Cadena vs StringBuilder

StringBuilder es mejor cuando es necesario cambiar el valor. De lo contrario, no hay necesidad de ello.

Si tengo que usar el mismo valor de cadena en 10 lugares, ya que es, voy a utilizar cuerdas. Si tengo que cambiar 10 veces, StringBuilder.

¿Quieres que realmente utilizar un constructor de cadena aquí?

Console.WriteLine("MyString");

StringBuilder es grande cuando se tiene que hacer grandes cantidades de concatenación para construir una cadena.

Jon Skeet tiene una gran Aricle en esta aquí: http: //www.yoda .arachsys.com / CSharp / stringbuilder.html

Confirmar la sección que comienza "Así que debo usar StringBuilder En todas partes, ¿verdad?"

El escribe:

  

La diferencia importante entre este   ejemplo y el anterior es que   podemos presentar fácilmente todas las cadenas   que deben ser concatenados   en una llamada a String.Concat. Ese   medios que no hay cuerdas intermedios se   necesario. StringBuilder es eficiente en   el primer ejemplo ya que actúa como una   contenedor para el resultado intermedio   sin tener que copiar ese resultado   cada vez - cuando ya no es   intermedia resultado de todos modos, no tiene   ventaja.


En resumen, se trata de un compromiso entre la mutable y inmutable

Vea esto: StringBuilder vs Cadena

StringBuilder no es más rápido que usar una cadena por lo que sólo la creación de una cadena.

StringBuilder puede ser más rápido cuando se tiene que concatenar varias cadenas juntas (como en bucle). Lo que vas a pagar una penalización en el rendimiento cuando se tiene que convertir el contenido constructor de cadena en una cadena.

Una de las ventajas reales de StringBuilder más de cuerdas es que se puede pasar a través de varios métodos y cadenas de agregación a lo largo del camino. No se puede hacer que al hacer pasar un objeto de cadena. Así que si usted tiene una operación recursiva donde se está construyendo como un objeto JSON o algo así, puede pasar a través de la StringBuilder y anexar los valores.

Una cadena es bueno porque es inmutable. Inmutable y que es bueno, es algo que los lenguajes funcionales se prueban de.

Porque si usted tiene un (referencia a) cadena "Esto es una cadena" puede estar seguro de que va a tener el mismo valor para siempre. Mientras que el valor de un StringBuilder podría ser cambiado (por una llamada de método, otro hilo etc).

Sin embargo, a veces es necesario prima, velocidad pura y optimizaciones de uso de memoria. En ese caso, se utiliza un StringBuilder.

Un ejemplo:

 var a = "This is a string";
 var b = a;
 a += ". And some part is added";   // a now references another string in memory

 var aSB = new StringBuilder("This is a string");
 var bSB = aSB
 aSB.Append(". And some part is added"); // aSB and bSB still reference the same memory spot

 Console.WriteLine(b);   // ==> This is a string
 Console.WriteLine(bSB); // ==> This is a string. And some part is added

Un análisis de que con el uso se proporciona en: concatenación de cadenas eficientemente .

Esencialmente, (aunque leer el enlace para el análisis completo), el uso StringBuilder al concatenar en un bucle no trivial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top