Jakie są zalety / wady (jeśli w ogóle) w użyciu
string output;
int i = 10;
output = string.Format("the int is {0}", i);
przeciw
string output;
int i = 10;
output = "the int is " + i;
Zawsze korzystałem z tego drugiego przykładu, ale wydaje się, że znaczna większość samouczków online korzysta z przykładu string.format. Nie sądzę, aby istniały jakiekolwiek rzeczywiste różnice pod względem wydajności, początkowo uważam, że koder nie musi przerywać łańcucha, aby wstawiać zmienne.
Odpowiedzi:
Jeśli uważasz, że tłumaczenie jest ważne w twoim projekcie, pierwsza składnia naprawdę w tym pomoże.
Na przykład możesz mieć:
Zauważ też, że twoje zmienne nie zawsze mogą znajdować się w tym samym miejscu zdania o tej składni:
źródło
System.out.println($"{name} is {age} year's old.");
Sprawdź pierwszą odpowiedź na /programming/4671610/why-use-string-format . Obejmuje wszystko moim zdaniem, dlaczego jest lepiej.
Ponadto każdy zestaw .NET ma pulę wewnętrzną, zawierającą kolekcję unikatowych ciągów. Po skompilowaniu kodu wszystkie literały ciągów, do których odwołujesz się w kodzie, są dodawane do tej puli. Jeśli masz kod, który wygląda tak:
To sprawia, że 2 ciągi w puli.
Jeśli masz:
"the int is {0} and the double is {1}"
W puli jest tylko jeden ciąg.
Nieco trudniej jest wiedzieć, kiedy ciągi są internowane, a kiedy nie, ponieważ kompilator ma pewną inteligencję podczas wykrywania ciągów, które czasem nie muszą być internowane ... Sprawdź na przykład ten artykuł, który daje więcej informacji na ten temat materia.
Edycja: po nieco wykopaniu napotkałem interesującą odpowiedź na pytanie: Kiedy lepiej jest użyć String.Format vs. konkatenacji ciągu? . Krótko mówiąc, autor odpowiedzi z +30 głosów przedstawia przekonujący argument na rzecz konkatenacji ciągów znaków, gdy lokalizacja nie jest zaangażowana.
źródło
Wolę pierwszy sposób, ponieważ pozwala mi dokładnie zobaczyć, jak będzie wyglądał łańcuch po wyjściu. Bardzo łatwo jest zapomnieć o dodaniu spacji lub dodatkowym odstępie podczas dodawania ciągów.
Jestem pewien, że pierwszy sposób wiąże się również z poprawą wydajności, ponieważ nie trzeba tworzyć dodatkowych ciągów; ale to nie jest moja główna troska.
źródło
Korzystając z pierwszej opcji, możesz przechowywać często używany ciąg formatu i zmniejszyć liczbę potrzebnych operacji pisania oraz ułatwić aktualizację łańcucha wszędzie tam, gdzie jest używany. Zasadniczo pierwsza opcja pozwala na łatwą implementację DRY. Jest to również o wiele ładniejsza składnia, jeśli wiele zmiennych musi być używanych w ciągu, jak wspomniałeś.
źródło
Myślę, że dzięki
string.Format()
temu łatwiej jest zobaczyć, jaki dokładnie będzie wynik (więc nie masz problemów z zapomnianymi spacjami lub czymś takim), a także łatwiej jest pisać i modyfikować.Jeśli chcesz wykonać bardzo proste formatowanie, użycie
+
operatora plus może być łatwiejsze, ale zwykle używam go tylko podczas łączenia dwóch ciągów, a nie więcej.Aby pokazać, jak
string.Format()
łatwiej jest modyfikować, weź pod uwagę, że chcesz dodać kropkę na końcu zdania w swoim przykładzie: przejście odstring.Format("The int is {0}", i)
dostring.Format("The int is {0}.", i)
jest tylko jedną postacią. Ale przejście od"the int is " + i
do"the int is " + i + '.'
to znacznie więcej.Kolejną zaletą
string.Format()
jest to, że pozwala łatwo określić format, na przykładstring.Format("The int is 0x{0:X}.", i)
. Jest to jeszcze ważniejsze przy formatowaniu daty.Jeśli chodzi o wydajność,
string.Format()
najprawdopodobniej jest wolniejsza niż proste łączenie łańcuchów. Ale taki kod najprawdopodobniej nie znajduje się na gorącej ścieżce, więc nie ma to znaczenia. A jeśli tak, to prawdopodobnie lepiej jest używaćStringBuilder
.źródło
Użyj tego, który sprawia, że kod jest najbardziej czytelny. Nie martw się o wydajność.
W poniższym przykładzie wolę B, ponieważ jest on po prostu bardziej czytelny. Ale powyższe tłumaczenia językowe również mają sens. Nie pozwól, aby ktokolwiek zmusił cię do użycia łańcucha znaków. Zamiast tego przeczytaj i wskaż doskonały blog Jeffa Atwooda na The Sad Tragedy of Micro Optimizations Theatre
ZA:
przeciw
B:
źródło
Ref: Ciąg wyjściowy: format lub konkat w C #?
Rozważ ten kod.
To nieco zmodyfikowana wersja twojego kodu.
Oto moje wyniki:
źródło