ToString
การใช้
ไม่คุณไม่ควรใช้ToString
ที่นี่
การต่อข้อมูลสตริงจะแปลงสตริงที่ไม่ใช่สตริงให้เป็นสตริงโดยอัตโนมัติซึ่งหมายความว่าตัวแปรทั้งสองของคุณจะเหมือนกันเกือบทั้งหมด:
เมื่อหนึ่งหรือทั้งสองตัวถูกดำเนินการเป็นสตริงประเภทตัวดำเนินการเพิ่มที่กำหนดไว้ล่วงหน้าเชื่อมโยงการแสดงสตริงของตัวถูกดำเนินการ
ที่มา: C # ภาษาสเปก: ผู้ประกอบการนอกจากนี้ MSDN
ในทางกลับกันคนแรก (ไม่รวมToString
):
- สั้นกว่าที่จะเขียน
- สั้นกว่าที่จะอ่าน
- ง่ายต่อการบำรุงรักษาและ:
- แสดงให้เห็นถึงความตั้งใจของผู้แต่ง: เพื่อเชื่อมโยงสตริงเข้าด้วยกัน
ดังนั้นเลือกอันแรก
ภายใต้ประทุน
สิ่งที่น่าสนใจก็คือดูว่าเกิดอะไรขึ้นภายใต้ประทุน อีกวิธีหนึ่งที่จะเห็นมันคือการดูรหัส IL ภายใน LINQPad โปรแกรมนี้:
void Main()
{
var a = 3;
var b = " Hello";
var c = a + b;
Console.WriteLine(c);
}
แปลเป็นภาษา IL ดังต่อไปนี้:
IL_0001: ldc.i4.3
IL_0002: stloc.0 // a
IL_0003: ldstr " Hello"
IL_0008: stloc.1 // b
IL_0009: ldloc.0 // a
IL_000A: box System.Int32
IL_000F: ldloc.1 // b
IL_0010: call System.String.Concat
IL_0015: stloc.2 // c
IL_0016: ldloc.2 // c
IL_0017: call System.Console.WriteLine
เห็นSystem.String.Concat
ไหม นั่นหมายความว่าโค้ดต้นฉบับสามารถเขียนได้เช่นเดียวกันซึ่งแปลเป็น IL เดียวกัน:
void Main()
{
var a = 3;
var b = " Hello";
var c = string.Concat(a, b); // This is the line which was changed.
Console.WriteLine(c);
}
เมื่อคุณอ่านเอกสารประกอบของstring.Concat(object[])
คุณอาจเรียนรู้ว่า:
วิธีการเชื่อมแต่ละวัตถุในargsโดยการเรียกToString
วิธีการแบบไม่มีพารามิเตอร์ของวัตถุนั้น มันไม่ได้เพิ่มตัวคั่นใด ๆ
ซึ่งหมายความว่าToString
ซ้ำซ้อน นอกจากนี้:
String.Empty
ถูกใช้แทนวัตถุใด ๆ null ในอาร์เรย์
ซึ่งจัดการอย่างกรณีที่ตัวถูกดำเนินการบางอย่างเป็นโมฆะ (ดูเชิงอรรถ 1)
ขณะที่ในตัวอย่างสุดท้ายการต่อข้อมูลได้ถูกแปลเป็นstring.Concat
หนึ่งควรเน้นการปรับให้เหมาะสมของคอมไพเลอร์:
var a = "Hello " + "World";
แปลเป็น:
ldstr "Hello World"
stloc.0
ในทางกลับกัน:
var a = string.Concat("Hello ", "World");
แปลเป็น:
ldstr "Hello "
ldstr "World"
call System.String.Concat
stloc.0
ทางเลือกอื่น ๆ
มีวิธีการอื่น ๆ ที่จะเชื่อมโยงการแทนค่าสตริงของวัตถุใน C #
StringBuilder
จะใช้เมื่อคุณต้องทำการดำเนินการเรียงต่อกันจำนวนมากและช่วยลดจำนวนสายอักขระตัวกลางที่สร้างขึ้น การตัดสินใจว่าคุณควรใช้StringBuilder
หรือการต่อข้อมูลแบบธรรมดาอาจไม่ใช่เรื่องง่าย ใช้ profiler หรือค้นหาคำตอบที่เกี่ยวข้องใน Stack Overflow
การใช้StringBuilder
มีข้อเสียเปรียบที่สำคัญในการทำให้โค้ดอ่านและบำรุงรักษาได้ยาก สำหรับกรณีง่าย ๆ อย่างที่เป็นในคำถามของคุณStringBuilder
ไม่เพียง แต่เป็นอันตรายต่อความสามารถในการอ่านโค้ด แต่ยังไร้ประโยชน์ในแง่ของประสิทธิภาพ
string.Join
ควรใช้เมื่อคุณต้องการเพิ่มตัวคั่น
เห็นได้ชัดว่าstring.Join
ห้ามใช้กับตัวคั่นที่ว่างเปล่าเพื่อเชื่อมสตริงเข้าด้วยกัน
string.Format
สามารถใช้เมื่อการสร้างสตริงสตริงต้องการการเชื่อมต่อสายอักขระ หนึ่งในกรณีที่คุณอาจต้องการคือเมื่อข้อความอาจมีการแปลตามคำแนะนำโดย kunthet
การใช้string.Format
มีข้อบกพร่องหลายประการซึ่งทำให้ไม่เหมาะสำหรับกรณีง่ายๆเช่นคุณ:
ด้วยตัวยึดง่าย "{0}" มักจะไม่ชัดเจนว่าพารามิเตอร์ตัวไหนไป บ่อยครั้งที่การย้อนกลับพารามิเตอร์ผิดพลาดหรือลืมอย่างใดอย่างหนึ่ง โชคดีที่C # 6 ในที่สุดก็แนะนำการแก้ไขสตริงซึ่งแก้ปัญหานี้ได้
ประสิทธิภาพรันไทม์อาจลดลง แน่นอนไม่ถือว่าstring.Format
เป็นมักจะช้าลง หากประสิทธิภาพมีความสำคัญให้วัดสองวิธีและกำหนดว่าวิธีใดจะเร็วกว่าโดยอิงจากผลลัพธ์ที่แท้จริงของคุณแทนที่จะเป็นข้อสมมติ
รหัสนี้ยาวกว่าการเขียนเล็กน้อยอ่านและอ่านได้ยากขึ้นแม้ว่าจะน้อยมากและไม่ควรรบกวนคุณมากเกินไป
null
¹ความแตกต่างที่ปรากฏขึ้นเมื่อหนึ่งของวัตถุที่เป็น หากไม่มีToString
a null
จะถูกแทนที่ด้วยสตริงว่าง ด้วยToString
การNullReferenceException
โยน
a + "" + b + ""
หรือ"" + a + b + ""
มันไม่สำคัญ: มันคือทั้งหมดที่เรียงต่อกันเป็นสตริง ในa + b + ""
มันไม่สำคัญ:a
และb
มีการเพิ่มเป็นครั้งแรก