2010-06-18 8 views
5

Ya se han formulado muchas preguntas sobre las diferencias entre cadena y cadena de caracteres y la mayoría de las personas sugieren que el generador de cadenas es más rápido que la cadena. Tengo curiosidad por saber si el generador de cuerdas es demasiado bueno, ¿por qué la cuerda está allí? Además, ¿puede algún organismo darme un ejemplo en el que la cadena sea más útil que el generador de cadenas?¿Dónde son las cadenas más útiles que un StringBuilder?

+2

Ver http://www.yoda.arachsys.com/csharp/stringbuilder.html –

+1

http://www.joelonsoftware.com/articles/fog0000000319.html Joel On Software tiene una buena explicación de lo que realmente sucede cuando concatenar dos cadenas. El artículo trata sobre C++, pero C# funciona de la misma manera. Ignora todo en y debajo del "¿Cómo soluciono esto?" sección, ya que esa parte es específica de C++; en C#, lo arreglas usando 'StringBuilder', que funciona de manera similar a las cosas en la sección" cómo puedo arreglar esto ". – Brian

+0

posible duplicado de [String vs. StringBuilder] (http://stackoverflow.com/questions/73883/string-vs-stringbuilder) – nawfal

Respuesta

3

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

A String es un String - uno o más caracteres al lado de cada uno. Si desea cambio una cadena de alguna manera, se limita a crear más cadenas porque son immutable.

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

No haga esto

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

o

s = s + " is now longer again"; 

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

hacer esto:

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(); 

que crearía 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 cadena en la memoria.

Como nota al margen, la creación de un StringBuilder requiere una cierta cantidad de memoria de todos modos.Como regla empírica:

  • Use siempre un StringBuilder si está concatenación de cadenas en un bucle.
  • Usa un StringBuilder si concatenas una cadena más de 4 veces.
+1

string.Concat es también una solución viable para su ejemplo. 'string s = string.Concat (" mi cadena "," ahora es un poco más larga "," ahora es más larga otra vez ");' –

+0

Buen punto. Supongo que es una cuestión de gusto. –

1

¿Realmente usaría un generador de cadenas aquí?

Console.WriteLine("MyString"); 

StringBuilder es ideal cuando necesita 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

Mira la sección que comienza "Por lo tanto, es conveniente utilizar StringBuilder En todas partes, ¿verdad?"

Él 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. Que significa que no se necesitan cadenas intermedias . StringBuilder es eficiente en el primer ejemplo ya que actúa como un contenedor para el resultado intermedio sin tener que copiar ese resultado cada vez - cuando no hay resultado intermedio de todos modos, no tiene ventaja.


+0

gracias brendan ... el enlace es realmente bueno – DJay

2

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

Si necesito usar el mismo valor de cadena en 10 lugares, como es, usaré String. Si necesito cambiarlo 10 veces, StringBuilder.

7

StringBuilder es una mejor opción cuando se construyen y modifican cadenas mediante bucles intensos o iteraciones.

Operaciones de cadena simples como algunas concatenaciones o simplemente almacenar un valor de cadena se adapta mejor a un objeto de cadena estándar.

Pregunta similar? String vs. StringBuilder

0

StringBuilder no es más rápido que usar una cadena tan solo como crear una cadena.

StringBuilder puede ser más rápido cuando tiene que concatenar varias cadenas juntas (como en el ciclo). Va a pagar una penalización de rendimiento cuando tenga que convertir el contenido del generador de cadenas en una cadena.

Una de las ventajas reales de StringBuilder sobre la cadena es que puede pasarla por varios métodos y agregar cadenas en el camino. No puedes hacer eso pasando un objeto de cadena. Entonces, si tiene una operación recursiva donde está construyendo como un objeto JSON o algo así, puede pasar el StringBuilder y agregar los valores.

11

StringBuilder es, como su nombre lo sugiere, se utiliza para construir cadenas, mientras que las cadenas son valores de caracteres inmutables. Use cadenas cuando desee pasar datos de caracteres, utilice StringBuilder cuando desee manipular datos de caracteres.

0

Una cuerda es buena porque es inmutable. Y eso inmutable es bueno, es algo que los lenguajes funcionales son probables.

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

Pero, a veces necesita optimizaciones de uso de memoria, pura y sin formato. En ese caso, usa un generador de cuerdas.

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 
0

Se proporciona un análisis del que se puede usar en: Concatenating Strings Efficiently.

Básicamente, (aunque lea el enlace para un análisis completo), use StringBuilder al concatenar en un bucle no trivial.

Cuestiones relacionadas