การต่อสายอักขระโดยใช้ตัวดำเนินการ '+'


86

เมื่อดูที่stringข้อมูลเมตาของชั้นเรียนฉันเห็นเพียงตัวดำเนินการ==และมีงาน!=มากเกินไป แล้วจะสามารถทำการเชื่อมต่อสำหรับตัวดำเนินการ ' +' ได้อย่างไร?

แก้ไข :

บันทึกที่น่าสนใจจาก Eric Lippert เกี่ยวกับการต่อสายอักขระ:

ส่วนที่ 1

ส่วนที่ 2

นอกจากนี้ยังมีบทความพิเศษจาก Joel ที่อ้างถึงในส่วนที่ 2 ( http://www.joelonsoftware.com/articles/fog0000000319.html )

คำตอบ:


143

มันไม่ - คอมไพเลอร์ C # ทำ :)

ดังนั้นรหัสนี้:

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

ได้รับการรวบรวมเป็น:

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

(Gah - การแก้ไขการแทรกแซงลบบิตอื่น ๆ โดยไม่ตั้งใจ)

ประโยชน์ของการสังเกตเรียบเรียง C # ว่ามี concatenations สตริงหลายนี่คือการที่คุณไม่ได้สิ้นสุดการสร้างสตริงกลางx + yซึ่งก็จะต้องมีการคัดลอกอีกครั้งในฐานะส่วนหนึ่งของการเรียงต่อกันของและ(x + y) zแต่เราทำทุกอย่างให้เสร็จในครั้งเดียว

แก้ไข: โปรดทราบว่าคอมไพเลอร์ไม่สามารถทำอะไรได้หากคุณเชื่อมต่อแบบวนซ้ำ ตัวอย่างเช่นรหัสนี้:

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

จบลงด้วยการเทียบเท่ากับ:

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

... สิ่งนี้จึงทำให้เกิดขยะจำนวนมากและเป็นเหตุผลที่คุณควรใช้ a StringBuilderสำหรับกรณีดังกล่าว ฉันมีบทความที่จะให้รายละเอียดเพิ่มเติมเกี่ยวกับทั้งสองข้อซึ่งหวังว่าจะตอบคำถามเพิ่มเติมได้


8
คำตอบที่ดี; เป็นเพียงคำถามติดตามผล: หากคุณเชื่อมสตริงภายในลูปคอมไพเลอร์จะทำงานอย่างไรกับตัวดำเนินการ. Concat เมื่อไม่สามารถรู้ล่วงหน้าว่าจะเกิดอะไรขึ้นในลูป
frenchie

อาโอเค! และนั่นเป็นเหตุผลว่าทำไมจึงควรใช้ StringBuilder สำหรับการเรียงต่อกัน
frenchie

4
@frenchie: นั่นเป็นเหตุผลที่ดีกว่าที่จะใช้ StringBuilder สำหรับการเรียงต่อกันซ้ำ ๆ ... แต่ทำไมมันไม่คุ้มค่าสำหรับการต่อจำนวนค่าคงที่
Jon Skeet

@ Jon-Skeet: ขอบคุณสำหรับการชี้แจงอย่างรวดเร็ว ... ฉันควรตรวจสอบใน IL ด้วย ... และนี่คือวิธีที่ int เพิ่มด้วยหรือไม่? โดยเรียกวิธีการเพิ่ม?
NoviceProgrammer

2
แต่โปรดทราบว่าปัจจุบันstring.Concatและstring.Joinวิธีการมีการโอเวอร์โหลดมากมายรวมถึงการใช้IEnumerable<>อินสแตนซ์บางอย่าง ดังนั้นในกรณีส่วนใหญ่จึงสะดวกกว่าการใช้ a StringBuilder(ฉันไม่รู้ว่าวิธีการเหล่านี้ใช้StringBuilderภายในหรือไม่ฉันแค่บอกว่าวิธีนี้สะดวกกว่าในกรณีส่วนใหญ่)
Jeppe Stig Nielsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.