Czy istnieje zauważalna różnica w wydajności między używaniem interpolacji ciągów:
myString += $"{x:x2}";
vs String.Format ()?
myString += String.Format("{0:x2}", x);
Pytam tylko dlatego, że Resharper podpowiada poprawkę, a mnie już wcześniej oszukano.
Odpowiedzi:
Godne uwagi jest względne. Jednak: interpolacja ciągów jest zmieniana w
string.Format()
czasie kompilacji, więc powinny zakończyć się tym samym wynikiem.Istnieją jednak drobne różnice: jak wynika z tego pytania, konkatenacja ciągów znaków w specyfikatorze formatu skutkuje dodatkowym
string.Concat()
wywołaniem.źródło
int
jest używane a).var a = "hello"; var b = $"{a} world";
kompiluje się do konkatenacji ciągów.var a = "hello"; var b = $"{a} world {1}";
kompiluje się do formatu string.interpolacja ciągów jest zamieniana na string.Format () w czasie kompilacji.
Również w string.Format możesz określić kilka wyjść dla pojedynczego argumentu i różne formaty wyjściowe dla pojedynczego argumentu. Ale interpolacja ciągów jest chyba bardziej czytelna. Więc to zależy od Ciebie.
Istnieją wyniki testów wydajności https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a
źródło
String::Format
. a czasami wString::Concat
. A test wydajności na tej stronie jest raczej nieistotny: liczba argumentów, które przekazujesz do każdej z tych metod, jest zależna. concat nie zawsze jest najszybszy, a stringbuilder nie zawsze jest najwolniejszy.Pytanie dotyczyło wydajności, jednak tytuł mówi tylko „vs”, więc czuję, że muszę dodać jeszcze kilka punktów, chociaż niektóre z nich są uparte.
Lokalizacja
string.Format
. Jest jednak do tego narzędzia (npReSharper
.).Konserwowalność (moja opinia)
string.Format
jest znacznie bardziej czytelny, ponieważ skupia się na zdaniu , które chciałbym wyrazić, na przykład podczas konstruowania ładnego i znaczącego komunikatu o błędzie. Używanie{N}
symboli zastępczych zapewnia mi większą elastyczność i łatwiej jest je później zmodyfikować.string.Format
jest na to znacznie mniej podatny.Na tej podstawie postanowiłem więc trzymać się
string.Format
większości mojego kodu. Jednak przygotowałem metodę rozszerzenia, aby mieć płynniejszy sposób kodowania, który lubię o wiele bardziej. Wdrożenie rozszerzenia jest jednowierszowe i wygląda tak po prostu w użyciu.Interpolacja to świetna funkcja, nie zrozum mnie źle. Ale IMO świeci najlepiej w tych językach, w których brakuje tej
string.Format
podobnej funkcji, na przykład JavaScript.źródło
{3}
jest X lub Y, zwłaszcza jeśli zaczniesz zmieniać format. Przykład Madlibs:$"It was a {adjective} day in {month} when I {didSomething}"
vsstring.Format("It was a {0} day in {1} when I {2}", adjective, month, didSomething)
->$"I {didSomething} on a {adjective} {month} day"
vsstring.Format("I {2} on a {0} {1} day", adjective, month, didSomething)
string.Format
myślę, że są znacznie mniej podatne na ten temat. Tak czy inaczej, dlatego podkreśliłem, że to moja opinia :)