2009-02-09 13 views
13

Powiel możliwe:
String vs StringBuilderKiedy używać StringBuilder?

Właśnie powrócił niektóre z książek, które kiedyś odebrać VB.NET. Nie jestem pewien, czy mam to w głowie, rozumiem jak/jaki jest StringBuilder.

Jakie są wskazówki dotyczące korzystania? Czy najlepiej go używać, jeśli łączysz 2 struny lub 50?

A może całkowita długość łańcucha jest większa niż 128 znaków?

Czy zobaczysz korzyści z wydajności, gdy użyjesz go do dodania ciągów razem?

W takim przypadku lepiej jest użyć instancji StringBuilder do zbudowania instrukcji SQL niż string.format("Select * from x where y = {0}",1)?

Zawsze mnie uderzało, że zadeklarowanie innej zmiennej i włączenie przestrzeni nazw nie jest korzystne dla małych konkatenacji ciągów, ale nie jestem teraz pewien.

Niestety, wiele dokumentacji mówi, czego używać, po prostu nie to, co najlepsze.

+0

Spróbuj pytanie: [http://stackoverflow.com/questions/73883/string-vs-stringbuilder](http://stackoverflow.com/questions/73883/string-vs-stringbuilder) –

Odpowiedz

32

Mam article on this very topic. W podsumowaniu (skopiowany z dołu strony):

  • pewno skorzystam StringBuilder kiedy złączenie w nietrywialne pętli - zwłaszcza jeśli nie wiesz na pewno (w czasie kompilacji) ile iteracji przejdziesz przez pętlę. Na przykład czytanie pliku po znaku naraz, budowanie ciągu znaków za pomocą operatora + = to potencjalnie samobójstwo.
  • Zdecydowanie użyj operatora konkatenacji, gdy możesz (w sposób czytelny) określić wszystko, co musi być połączone w jednym wyciągu. (Jeśli masz wiele rzeczy do połączenia, pomyśl o jawnym wywołaniu String.Concat - lub String.Join, jeśli potrzebujesz separatora.)
  • Nie bój się łamać literałów na kilka połączonych bitów - wynik będzie to samo. Możesz ułatwić czytelność, łamiąc długą literał na kilka linii, na przykład, bez szkody dla wydajności.
  • Jeśli potrzebujesz pośrednich rezultatów konkatenacji dla czegoś innego niż podawanie następnej iteracji konkatenacji, StringBuilder nie pomoże ci. Na przykład, jeśli utworzysz pełne imię i nazwisko od imienia i nazwiska, a następnie dodasz do końca trzecią informację (pseudonim), skorzystasz tylko z StringBuilder, jeśli tego nie zrobisz potrzebujemy ciągu (imię i nazwisko) do innych celów (tak jak robimy to w przykładzie, który tworzy obiekt Person).
  • Jeśli masz tylko kilka konkatenacji i naprawdę chcesz zrobić to w oddzielnych oświadczeniach, to nie ma znaczenia, w którą stronę pójdziesz. Która z metod jest bardziej wydajna, zależy od liczby konkatenacji, których dotyczą rozmiary łańcucha i od tego, w jakiej kolejności są łączone. Jeśli naprawdę wierzysz, że ten fragment kodu jest wąskim gardłem wydajności, zmień profil lub porównuj go w obie strony.
+1

Ciekawy, czy kiedykolwiek profilowałeś StringBuilder vs. String.Concat (theStrings.ToArray())? String.Concat jest rzeczywiście dość skuteczną metodą. – JaredPar

+0

Jeśli masz już wszystkie potrzebne ciągi w tablicy, to spodziewam się, że String.Concat naprawdę będzie bardzo szybki - może wyliczyć (idealnie) rozmiar wymagany do rozpoczęcia. Konieczność przekonwertowania listy na tablicę jest niefortunna. A String.Concat (IList ) byłoby miłe. –

+0

Aha, iw innych wiadomościach: wytnij i wklej dla wygranej;) –

12

Oto moja zasada:

StringBuilder najlepiej stosować, gdy dokładna liczba powiązań, jest znany w czasie kompilacji.

+0

Ok, tak aby oznaczałoby, że 99% aplikacji bazodanowych nie użyłoby konstruktora string do zbudowania instrukcji SQL, ale czasami nie jesteś pewien, ile "serwerów", które zamierzasz połączyć do końca, będzie równe 1 ... ale nie powinno być więcej niż 3, czy nadal używasz do tego stringbuildera? – spacemonkeys

+0

To dobra zasada, ale czasami, gdy budujesz bardzo duży ciąg, ale nie używasz pętli, StringBuilder będzie lepszy. –

+0

@BC - dobry punkt - reguły kciuka zawsze mają wyjątki :) –

0

Osobiście używam StringBuilder, gdy mam więcej niż jeden lub dwa ciągi łączące. Nie jestem pewien, czy istnieje prawdziwy hit wydajności, ale zawsze czytałem i mówiono mi, że robienie regularnego łączenia z wieloma ciągami tworzy dodatkową kopię ciągu za każdym razem, gdy używasz StringBuilder utrzymuje jeden skopiuj, dopóki nie wywołasz na nim ostatecznej metody ToString().

0

Ktoś odkrył eksperymentalnie, że liczba krytyczna wynosi 6. Więcej niż 6 konkatenacji z rzędu i powinieneś użyć StringBuilder. Nie pamiętam, gdzie to znalazłem.

jednak pamiętać, że jeśli tylko napisać to w linii:

"qwert" + "yuiop" + "asdf" + "gh" + "jkl;" + "zxcv" + "bnm" + ",." 

że dostaje przekształcone w jednym wywołaniu funkcji (nie wiem jak napisać to w VB.NET)

String.Concat("qwert", "yuiop", "asdf", "gh", "jkl;", "zxcv", "bnm", ",."); 

Więc jeśli robisz wszystkie konkatenacje w jednej linii, nie przejmuj się StringBuilder, ponieważ String.Concat skutecznie wykona wszystkie konkatenacje za jednym razem. Dzieje się tak tylko wtedy, gdy robisz je w pętli lub sukcesywnie łączymy.

0

Moja zasada - podczas dodawania do łańcucha w pętli For lub Foreach użyj StringBuilder.