มีความแตกต่างของประสิทธิภาพที่สังเกตได้ระหว่างการใช้การแก้ไขสตริง:
myString += $"{x:x2}";
เทียบกับ String.Format ()?
myString += String.Format("{0:x2}", x);
ฉันแค่ถามเพราะ Resharper กำลังแจ้งการแก้ไขและฉันเคยโดนหลอกมาก่อน
มีความแตกต่างของประสิทธิภาพที่สังเกตได้ระหว่างการใช้การแก้ไขสตริง:
myString += $"{x:x2}";
เทียบกับ String.Format ()?
myString += String.Format("{0:x2}", x);
ฉันแค่ถามเพราะ Resharper กำลังแจ้งการแก้ไขและฉันเคยโดนหลอกมาก่อน
คำตอบ:
ที่สังเกตได้คือญาติ อย่างไรก็ตาม: การแก้ไขสตริงถูกเปลี่ยนเป็นstring.Format()
เวลาคอมไพล์ดังนั้นจึงควรได้ผลลัพธ์เดียวกัน
แม้ว่าจะมีความแตกต่างเล็กน้อยดังที่เราทราบได้จากคำถามนี้การต่อสายอักขระในตัวระบุรูปแบบจะทำให้เกิดการstring.Concat()
เรียกเพิ่มเติม
int
) var a = "hello"; var b = $"{a} world";
คอมไพล์เพื่อเชื่อมต่อสตริง var a = "hello"; var b = $"{a} world {1}";
คอมไพล์เป็นรูปแบบสตริง
การแก้ไขสตริงจะเปลี่ยนเป็นสตริงรูปแบบ () ในเวลาคอมไพล์
นอกจากนี้ในสตริงรูปแบบคุณสามารถระบุเอาต์พุตหลายรายการสำหรับอาร์กิวเมนต์เดียวและรูปแบบเอาต์พุตที่แตกต่างกันสำหรับอาร์กิวเมนต์เดียว แต่การแก้ไขสตริงนั้นอ่านได้ง่ายกว่าฉันเดา ดังนั้นขึ้นอยู่กับคุณ
a = string.Format("Due date is {0:M/d/yy} at {0:h:mm}", someComplexObject.someObject.someProperty);
b = $"Due date is {someComplexObject.someObject.someProperty:M/d/yy} at {someComplexObject.someObject.someProperty:h:mm}";
มีผลการทดสอบประสิทธิภาพบางส่วนhttps://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a
String::Format
กลายเป็น String::Concat
และบางครั้งเข้า และการทดสอบประสิทธิภาพในหน้านั้นไม่ได้มีความหมายจริงๆ: จำนวนข้อโต้แย้งที่คุณส่งผ่านไปยังแต่ละวิธีนั้นขึ้นอยู่กับ concat ไม่ได้เร็วที่สุดเสมอไปนักสร้างสตริงไม่ใช่คนที่ช้าที่สุดเสมอไป
คำถามเกี่ยวกับประสิทธิภาพ แต่ชื่อเรื่องบอกว่า "vs" ดังนั้นฉันจึงรู้สึกว่าต้องเพิ่มคะแนนอีกเล็กน้อยบางส่วนก็มีความเห็น
การแปล
string.Format
ก่อนที่จะแปลว่ามันได้กลายเป็น อย่างไรก็ตามมีเครื่องมือสำหรับสิ่งนั้น (เช่นReSharper
)การบำรุงรักษา (ความคิดเห็นของฉัน)
string.Format
สามารถอ่านได้มากขึ้นเนื่องจากเน้นไปที่ประโยคที่ฉันต้องการจะใช้เป็นวลีเช่นเมื่อสร้างข้อความแสดงข้อผิดพลาดที่ดีและมีความหมาย ใช้{N}
ตัวยึดตำแหน่งทำให้ฉันมีความยืดหยุ่นมากขึ้นและง่ายต่อการแก้ไขในภายหลังstring.Format
มีแนวโน้มที่จะเกิดสิ่งนี้น้อยกว่ามากจากสิ่งเหล่านี้ฉันตัดสินใจที่จะยึดติดกับstring.Format
รหัสส่วนใหญ่ของฉัน อย่างไรก็ตามฉันได้เตรียมวิธีการขยายเพื่อให้มีวิธีการเข้ารหัสที่คล่องขึ้นซึ่งฉันชอบมากขึ้น การใช้งานของส่วนขยายเป็นแบบซับเดียวและดูเหมือนว่าจะใช้งานได้
var myErrorMessage = "Value must be less than {0:0.00} for field {1}".FormatWith(maximum, fieldName);
การสอดแทรกเป็นคุณสมบัติที่ยอดเยี่ยมอย่าเข้าใจฉันผิด แต่ IMO เป็นภาษาที่ดีที่สุดในภาษาเหล่านั้นซึ่งไม่มีstring.Format
คุณสมบัติเหมือนเช่น JavaScript
{3}
เป็น X หรือ Y โดยเฉพาะอย่างยิ่งถ้าคุณเริ่มจัดรูปแบบของคุณใหม่ ตัวอย่าง Madlibs: $"It was a {adjective} day in {month} when I {didSomething}"
vs string.Format("It was a {0} day in {1} when I {2}", adjective, month, didSomething)
-> $"I {didSomething} on a {adjective} {month} day"
vsstring.Format("I {2} on a {0} {1} day", adjective, month, didSomething)
string.Format
ฉันคิดว่าคุณมีแนวโน้มที่จะเกิดปัญหานี้น้อยกว่ามาก แต่อย่างไรก็ตามนี่คือเหตุผลที่ฉันเน้นย้ำว่านั่นคือความคิดของฉัน :)