¿Dónde están las cadenas más útil que un StringBuilder?
-
28-09-2019 - |
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?
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.