Sono già state poste molte domande sulle differenze tra string e string builder e la maggior parte delle persone suggerisce che il generatore di stringhe sia più veloce della stringa. Sono curioso di sapere se il generatore di stringhe è troppo buono, quindi perché la stringa è lì? Inoltre, qualche corpo può darmi un esempio in cui la stringa sarà più utile del generatore di stringhe?Dove sono le stringhe più utili di un StringBuilder?
risposta
Non è un caso di cui è più utile ...
A String
è un String
- uno o più caratteri uno accanto all'altro. Se si vuole cambiamento una stringa in qualche modo, sarà sufficiente creare più stringhe perché sono immutable.
A StringBuilder
è una classe che crea stringhe. Fornisce un mezzo per costruirli senza creare molte stringhe ridondanti in memoria. Il risultato finale sarà sempre un String
.
Non fare questo
string s = "my string";
s += " is now a little longer";
o
s = s + " is now longer again";
che creerebbe stringhe in memoria (in realtà, vedi sotto).
fare questo:
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();
che creerebbe stringa in memoria (ancora una volta, vedi sotto).
Si può fare questo:
string s = "It is now " + DateTime.Now + ".";
Questo crea solo stringa in memoria.
Come nota a margine, la creazione di un StringBuilder
richiede comunque una certa quantità di memoria.Come regola approssimativa:
- Utilizzare sempre un
StringBuilder
se si concatenano stringhe in un ciclo. - Utilizzare un
StringBuilder
se si concatena una stringa più di 4 volte.
string.Concat è anche una soluzione praticabile per il tuo esempio. 'string s = string.Concat (" la mia stringa "," ora è un po 'più lunga "," ora è di nuovo più lunga ");' –
Buon punto. Immagino sia una questione di gusti. –
Utilizzeresti davvero un generatore di stringhe qui?
Console.WriteLine("MyString");
StringBuilder è ottimo quando è necessario eseguire grandi quantità di concatenazione per creare una stringa.
Jon Skeet ha un grande aricle su questo qui: http://www.yoda.arachsys.com/csharp/stringbuilder.html
controllare la sezione che inizia "Allora dovrei usare StringBuilder Ovunque, vero?"
Egli scrive:
La differenza fondamentale tra questo esempio e quello precedente è che possiamo presentare facilmente tutte le corde che devono essere concatenati insieme in una chiamata a String.Concat. Che significa che nessuna stringa intermedia è necessaria. StringBuilder è efficiente nel primo esempio perché agisce come un contenitore per il risultato intermedio senza dover copiare tale risultato ogni volta - quando non c'è risultato intermedio comunque, non ha vantaggio.
grazie brendan..il link è veramente buono – DJay
StringBuilder è migliore quando è necessario modificare il valore. Altrimenti, non ce n'è bisogno.
Se ho bisogno di utilizzare lo stesso valore di stringa in 10 punti, come lo sono, userò String. Se ho bisogno di cambiarlo 10 volte, StringBuilder.
StringBuilder è un'opzione migliore quando si costruiscono e si modificano stringhe tramite looping o iterazioni pesanti.
Le semplici operazioni di stringa come alcune concatenazioni o semplicemente la memorizzazione di un valore di stringa si adattano molto meglio a un oggetto stringa standard.
Domanda simile? String vs. StringBuilder
StringBuilder non è più veloce dell'utilizzo di una stringa fino alla semplice creazione di una stringa.
StringBuilder può essere più veloce quando si devono concatenare più stringhe insieme (come nel ciclo). Stai pagando una penalizzazione delle prestazioni quando devi convertire il contenuto del generatore di stringhe in una stringa.
Uno dei vantaggi reali di StringBuilder su stringa è che è possibile passarlo attraverso diversi metodi e aggiungere stringhe lungo il percorso. Non puoi farlo passando un oggetto stringa. Quindi, se si dispone di un'operazione ricorsiva in cui si sta costruendo come un oggetto JSON o qualcosa del genere, è possibile passare a StringBuilder e aggiungere i valori.
StringBuilder è, come suggerisce il nome, è utilizzato per build stringhe, mentre le stringhe sono valori di carattere immutabili. Usa le stringhe quando vuoi passare i dati dei personaggi, usa StringBuilder quando vuoi manipolare i dati dei personaggi.
Una stringa è buona perché è immutabile. E quello immutabile è buono, è qualcosa di cui si dimostrano le lingue funzionali.
Perché se si dispone di una stringa (di riferimento) "Questa è una stringa" si può essere sicuri che avrà lo stesso valore per sempre. Mentre il valore di un StringBuilder potrebbe essere cambiato (tramite una chiamata al metodo, un altro thread, ecc.).
Tuttavia, a volte è necessario ottimizzare la velocità pura e l'utilizzo della memoria. In tal caso si utilizza un costruttore di stringhe.
Un esempio:
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
In breve, si tratta di un trade-off tra mutabile e immutabile
vedere questo: StringBuilder vs String
Un'analisi di cui utilizzare è fornita a: Concatenating Strings Efficiently.
In sostanza, (sebbene leggere il collegamento per l'analisi completa), utilizzare StringBuilder
quando si concatena in un ciclo non banale.
- 1. Quando sono utili le Trasformazioni di Schwartz?
- 2. Quali sono i plugin Xcode più utili?
- 3. Le immagini vettoriali sono utili per Android?
- 4. Quando i Generatori di espressioni ASP.NET sono più utili?
- 5. Perché le continuazioni non sono utili?
- 6. Le stringhe nella matrice non sono più stringhe dopo jQuery.each()
- 7. Does StringBuilder utilizza più memoria rispetto alla concatenazione di stringhe?
- 8. .NET concatenazione di stringhe (+ & + =) vs. StringBuilder
- 9. Le funzioni aggregate definite dall'utente più utili
- 10. Dove è implementato `+` per le stringhe nel codice sorgente Java?
- 11. Per cosa sono utili le globali di Ruby?
- 12. Eclipse: refactoring più utili
- 13. Metodi nidificati? Perché sono utili?
- 14. In quali circostanze sono utili le proprietà atomiche?
- 15. Dove sono le annotazioni JDBC4?
- 16. Classi Java più interessanti/utili?
- 17. Quali sono i pacchetti intelligenti più utili per Meteor.js
- 18. StringBuilder modificato da più thread
- 19. Le stringhe C++ sono modificabili con le stringhe Java UNLIKE?
- 20. Pacchetti/librerie ActionScript più utili
- 21. Dove sono le mie gemme di rubino?
- 22. Quali sono le informazioni più utili da visualizzare nella parte anteriore dell'ufficio?
- 23. Le stringhe sono raggruppate in Python
- 24. Dove sono le librerie di Erlang?
- 25. Dove sono le mie lezioni di System.Management. *?
- 26. Dove sono le rails 3 di asset_host?
- 27. più veloce metodo di ricerca in StringBuilder
- 28. Che cosa sono kAudioSessionProperty_InputSources effettivamente utili?
- 29. Le scorciatoie più utili (produttive) in Qt Creator
- 30. Quali sono gli attributi di convalida ASP.NET MVC 2.0 più utili
Vedere http://www.yoda.arachsys.com/csharp/stringbuilder.html –
http://www.joelonsoftware.com/articles/fog0000000319.html Joel On Software ha una buona spiegazione di ciò che accade effettivamente quando si concatenare due stringhe. L'articolo riguarda C++, ma C# funziona allo stesso modo. Ignora tutto in e sotto "Come posso risolvere questo problema?" sezione, poiché quella parte è specifica per C++; in C#, lo aggiusti usando 'StringBuilder', che funziona in modo simile a quanto riportato nella sezione" come posso risolvere questo problema ". – Brian
possibile duplicato di [String vs. StringBuilder] (http://stackoverflow.com/questions/73883/string-vs-stringbuilder) – nawfal