Zastanawiam się, co to jest "najlepsza praktyka", aby przełamać długie łańcuchy w kodzie źródłowym C#. Czy ten ciąg znaków jest konkatenowany podczas kompilowania lub w czasie wykonywania?Najlepszy sposób na złamanie długich ciągów w kodzie źródłowym C#
Odpowiedz
Jest to wykonywane podczas kompilacji. Jest to dokładnie równoważne "string1string2string3".
Załóżmy, że masz:
string x = "string1string2string3"
string y = "string1" + "string2" + "string3"
kompilator wykona stosowne interning takie, że x i y odnoszą się do tych samych obiektów.
EDYCJA: W odpowiedziach i komentarzach dużo się mówi o StringBuilder
. Wielu programistów wydaje się wierzyć, że konkatenacja łańcuchów powinna być zawsze zawsze z StringBuilder
. To jest nadmierna generalizacja - warto to zrozumieć why StringBuilder
is good in some situations, and not in others.
Konkatenacja jest wykonywana w czasie kompilacji, więc nie ma narzutu czasu wykonywania.
Nie możesz użyć StringBuilder
?
Twój przykład zostanie połączony podczas kompilacji. Wszystkie ciągi inline i stałe zmienne łańcuchowe są łączone w czasie kompilacji.
Należy pamiętać o tym, że uwzględnienie jakichkolwiek łańcuchów tylko do odczytu opóźni konkatencję do środowiska wykonawczego. string.Empty i Environment.NewLine są zmiennymi łańcuchowymi tylko do odczytu.
To naprawdę zależy od tego, czego potrzebujesz. Ogólnie rzecz biorąc, jeśli potrzebujesz konkatować łańcuchy, najlepszą wydajność w środowisku wykonawczym uzyskasz za pomocą StringBuilder. Jeśli odnosisz się w kodzie źródłowym, jak np. Var str = "String1" + "String2", to będzie konwertował na ciąg str = "String1String2" na kompilacji. W takim przypadku nie ma żadnych kosztów związanych z konkatenacją:
Twoje uogólnienie jest zbyt ogólne - jeśli możesz wykonać całą konkatenację jednym ruchem, zwykle jest to szybsze (i bardziej czytelne) niż użycie StringBuilder. Tak więc preferuj "x + y + z" do nowego StringBuilder (x) .Append (y) .Append (z) .ToString(). StringBuilder jest przydatny, gdy występują * powtórzone * konkatenacje. –
Aby drugi punkt Jona ... StringBuilder jest przydatny podczas zapętlania itp. W przypadku pojedynczego zestawu operacji ciąg.Concat jest prostszy i działa tak samo. –
Dzięki Marc - zabrakło mi miejsca :) Zmieniono moją odpowiedź, aby wskazać na mój artykuł StringBuilder choć ... –
Jeśli białe spacje nie są ważne, możesz użyć znaku uciec @ do napisania wieloliniowych ciągów w kodzie. Jest to przydatne, jeśli masz zapytanie w kodzie na przykład:
string query = @"SELECT whatever
FROM tableName
WHERE column = 1";
to daje ciąg linii z przerwami i klapek, ale dla kwerendy, która nie ma znaczenia.
StringBuilder to dobry sposób, aby przejść, jeśli masz wiele (więcej niż około czterech) ciągów do konkatenacji. Jest szybsze.
Użycie powyższego przykładu String.Concat odbywa się w czasie kompilacji. Ponieważ są to łańcuchy literalne, są one optymalizowane przez kompilator.
Jeśli jednak używać zmiennych:
string a = "string1";
string b = "string2";
string c = a + b;
Odbywa się to w czasie wykonywania.
"Więcej niż 4" ma znaczenie tylko przy pętli nad zestawem danych; w przeciwnym razie pojedyncze wywołanie string.Concat (przekazując tablicę, jeśli to konieczne) jest identyczne. –
To, co mówisz, jest prawdą. http://dotnetperls.com/Content/StringBuilder-Performance.aspx –
StringBuilder będzie twoim najszybszym podejściem, jeśli używasz dowolnej ilości łańcuchów.
http://dotnetperls.com/Content/StringBuilder-1.aspx
Jeśli tylko robi kilka ciąg (5 lub mniej to dobra zasada) prędkość nie ma znaczenia, z jakiego rodzaju konkatenacji używasz.
Konstruktor stringów jest szybszym rozwiązaniem * środowiska wykonawczego *, ale podane wyrażenie będzie lepiej ocenione w czasie kompilacji (co moim zdaniem nie powinno stanowić problemu dla kompilator) – peterchen
Jest jakikolwiek sposób to zrobić. Moja ulubiona używa metody łańcucha z C#. Próbka pierwsza:
string s = string.Format ("{0} {1} {0}", "Hello", "By"); wynikiem jest s = "Hello By Hello";
- 1. MySQL najlepszy sposób przechowywania długich łańcuchów
- 2. Najlepszy sposób na wykonywanie długich zapytań DB w klasycznej ASP?
- 3. Najlepszy sposób na zgłaszanie wyjątków w kodzie JNI?
- 4. Najlepszy sposób losowania listy ciągów w Pythonie
- 5. Ukrywanie ciągów w zakodowanym kodzie
- 6. Najlepsze projekty WPF o otwartym kodzie źródłowym
- 7. Jak odczytać zmienną CMake w kodzie źródłowym C++
- 8. Najlepszy sposób na zapisanie pliku w C#
- 9. Najlepszy sposób na przesunięcie tablicy w C?
- 10. Gdzie jest Model.py w kodzie źródłowym Django?
- 11. w kodzie źródłowym kodu, jak używać KeyAttribute na wielu kolumnach
- 12. Przechowywanie długich ciągów binarnych (danych surowych)
- 13. Głębokie nurkowanie w otwartym kodzie źródłowym
- 14. Budowanie konkretnego modułu w kodzie źródłowym Androida
- 15. Najlepszy sposób na zaprojektowanie łańcucha znaków
- 16. Jaki jest najlepszy sposób przechowywania ciągów UTF-8 w pamięci w C/C++?
- 17. Tworzenie długich ciągów z zestawu wyników
- 18. Sieć społeczna o otwartym kodzie źródłowym
- 19. Mechanizm rozpoznawania mowy o otwartym kodzie źródłowym
- 20. Czy istnieje sposób na uzyskanie wersji pakietu Cabal w kodzie źródłowym pakietu?
- 21. Autouzupełnianie DrRacket nie widzi funkcji zdefiniowanych w moim kodzie źródłowym
- 22. Najlepszy sposób na zerwanie łańcucha na ostatniej kropce na C#
- 23. Przechowywanie długich ciągów (CLOB) w bazach danych Hsqldb?
- 24. Python/Django - Unikaj zapisywania haseł w kodzie źródłowym
- 25. Jak szybko zorganizować funkcje w kodzie źródłowym (C#), aby zamówić w kolejności alfabetycznej?
- 26. Najlepszy sposób obsługi przepełnienia Integer w C#?
- 27. Przechowywanie TODO w trybie org w kodzie źródłowym
- 28. Najlepszy sposób na wyczyszczenie UITextField
- 29. Najlepszy sposób na łączenie łańcuchów w PHP z odstępami między
- 30. Najlepszy sposób na przesyłanie wideo przez gniazdo TCP w C
Uczyniłoby to kod mniej czytelnym * i * mniej wydajnym. Innymi słowy, byłoby to złe. –
Wystarczająco uczciwe, myślałem, że jeśli robisz dużo łączenia, to zalecane jest stringbuilder? – Damien
Jeśli robisz dużo konkatenacji podczas wykonywania, to tak, zalecane jest StringBuilder. Ale powyższy przykład ma ciągi statyczne, więc kompilator optymalizuje je już do pojedynczego ciągu znaków. – Maxam