2008-11-12 26 views

Odpowiedz

47

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.

3

Konkatenacja jest wykonywana w czasie kompilacji, więc nie ma narzutu czasu wykonywania.

0

Nie możesz użyć StringBuilder?

+0

Uczyniłoby to kod mniej czytelnym * i * mniej wydajnym. Innymi słowy, byłoby to złe. –

+0

Wystarczająco uczciwe, myślałem, że jeśli robisz dużo łączenia, to zalecane jest stringbuilder? – Damien

+0

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

7

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.

1

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ą:

+0

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. –

+0

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. –

+0

Dzięki Marc - zabrakło mi miejsca :) Zmieniono moją odpowiedź, aby wskazać na mój artykuł StringBuilder choć ... –

37

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.

1

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.

+0

"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. –

+0

To, co mówisz, jest prawdą. http://dotnetperls.com/Content/StringBuilder-Performance.aspx –

-3

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.

+0

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

0

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";

Powiązane problemy