Łączenie ciągów za pomocą operatora „+”


Odpowiedzi:


143

Tak nie jest - kompilator C # robi :)

Więc ten kod:

string x = "hello";
string y = "there";
string z = "chaps";
string all = x + y + z;

w rzeczywistości jest kompilowany jako:

string x = "hello";
string y = "there";
string z = "chaps";
string all = string.Concat(x, y, z);

(Gah - interwencja edycji usunęła przypadkowo inne bity.)

Zaletą kompilatora C #, który zauważa, że ​​istnieje tutaj wiele konkatenacji ciągów, jest to, że nie tworzysz pośredniego ciągu, x + yktóry następnie musi zostać ponownie skopiowany w ramach łączenia (x + y)i z. Zamiast tego robimy to wszystko za jednym zamachem.

EDYCJA: Zauważ, że kompilator nie może nic zrobić, jeśli połączysz się w pętli. Na przykład ten kod:

string x = "";
foreach (string y in strings)
{
    x += y;
}

po prostu kończy się jako odpowiednik:

string x = "";
foreach (string y in strings)
{
    x = string.Concat(x, y);
}

... więc nie generują dużo śmieci, i to, dlaczego należy używać StringBuilderdo takich przypadków. Mam artykuł zawierający więcej szczegółów na temat tych dwóch, który, mam nadzieję, odpowie na dalsze pytania.


8
Dobra odpowiedź; tylko pytanie uzupełniające: jeśli łączysz łańcuchy wewnątrz pętli, jak kompilator działa z operatorem .Concat, skoro nie może z góry wiedzieć, co będzie w pętli.
frenchie

Aha! I dlatego lepiej jest używać StringBuilder do konkatenacji?
frenchie

4
@frenchie: Dlatego lepiej jest używać StringBuilder do wielokrotnego łączenia ... ale dlaczego nie warto tego robić w przypadku konkatenacji stałej liczby wartości .
Jon Skeet

@ Jon-Skeet: dzięki za szybkie wyjaśnienie ... powinienem był sprawdzić również w IL ... i tak też dodaje int? wywołując metodę Add?
NoviceProgrammer

2
Należy jednak pamiętać, że obecnie metody string.Concati string.Joinmają wiele przeciążeń, w tym niektóre przyjmujące IEnumerable<>instancję. Są więc wygodniejsze w użyciu w większości przypadków niż użycie a StringBuilder(nie wiem, czy te metody używają StringBuilderwewnętrznie, po prostu mówię, że są one wygodniejsze w większości przypadków).
Jeppe Stig Nielsen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.