"+" Operatörünü kullanarak Dize Birleştirme


86

stringSınıf meta verilerine baktığımda, yalnızca operatörleri ==ve !=aşırı yüklenmiş görüyorum . Öyleyse, ' +' operatörü için birleştirme nasıl gerçekleştirilebilir ?

Düzenle :

Eric Lippert'ten dizi birleştirme üzerine bazı ilginç notlar:

Bölüm 1

Bölüm 2

Ayrıca, 2. bölümde atıfta bulunulan Joel'dan bir süper makale var ( http://www.joelonsoftware.com/articles/fog0000000319.html )

Yanıtlar:


143

Olmaz - C # derleyicisi yapar :)

Yani bu kod:

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

aslında şu şekilde derlenir:

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

(Gah - araya giren düzenleme diğer bitleri yanlışlıkla kaldırdı.)

Birden çok dize concatenations burada olduğunu C # derleyicisi Farkettiğin yararı arasında bir ara dize oluşturma sonunda kalmamasıdır x + ysonra arka arkaya gelmesini parçası olarak yeniden kopyalanması gereken hangi (x + y)ve z. Bunun yerine, hepsini tek seferde hallederiz.

DÜZENLEME: Bir döngüde birleştirirseniz derleyicinin hiçbir şey yapamayacağını unutmayın . Örneğin, bu kod:

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

sadece şuna eşdeğerdir:

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

... yani bu does çöp bir sürü oluşturur ve bir kullanmalısınız neden bu kadar StringBuilderböyle durumlar için. İkisi hakkında daha fazla ayrıntıya giren bir makalem var ve umarım başka soruları cevaplar.


8
İyi cevap; sadece bir takip sorusu: bir döngü içinde dizeleri birleştiriyorsanız, derleyici döngüde ne olacağını önceden bilemediğinde .Concat operatörünü nasıl çalışır?
frenchie

Ah tamam! Ve bu yüzden birleştirmeler için StringBuilder kullanmak daha iyidir?
fransız

4
@frenchie: Bu nedenle, tekrarlanan birleştirme için StringBuilder kullanmak daha iyidir ... ama sabit sayıda değerin birleştirilmesi için buna değmemesinin nedeni budur .
Jon Skeet

@ Jon-Skeet: Hızlı açıklama için teşekkürler ... IL'yi de kontrol etmeliydim ... ve bu da int nasıl ekler? Add yöntemini çağırarak?
NoviceProgrammer

2
Ancak günümüzde string.Concatve string.Joinyöntemlerinin, bazıları bir IEnumerable<>örneği almak da dahil olmak üzere birçok aşırı yüklemeye sahip olduğunu unutmayın . Bu yüzden çoğu durumda a kullanmaktan daha uygundurlar StringBuilder(bu yöntemlerin StringBuilderdahili olarak kullanıp kullanmadığını bilmiyorum , sadece çoğu durumda daha uygun olduklarını söylüyorum).
Jeppe Stig Nielsen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.