คุณใช้สตริงคำต่อคำกับการแก้ไขอย่างไร?


133

ใน C # 6 มีคุณสมบัติใหม่: สตริงที่ถูกสอดแทรก

สิ่งเหล่านี้ช่วยให้คุณสามารถใส่นิพจน์ลงในโค้ดได้โดยตรงแทนที่จะใช้ดัชนี:

string s = string.Format("Adding \"{0}\" and {1} to foobar.", x, this.Y());

กลายเป็น:

string s = $"Adding \"{x}\" and {this.Y()} to foobar.";

อย่างไรก็ตามเรามีสตริงจำนวนมากในหลายบรรทัดโดยใช้สตริงคำต่อคำ (ส่วนใหญ่เป็นคำสั่ง SQL) ดังนี้:

string s = string.Format(@"Result...
Adding ""{0}"" and {1} to foobar:
{2}", x, this.Y(), x.GetLog());

การเปลี่ยนกลับเป็นสตริงปกติดูเหมือนจะยุ่งเหยิง:

string s = "Result...\r\n" +
$"Adding \"{x}\" and {this.Y()} to foobar:\r\n" +
x.GetLog().ToString();

ฉันจะใช้ทั้งคำต่อคำและสตริงที่ถูกสอดแทรกร่วมกันได้อย่างไร


3
หากเป็นเรื่องเกี่ยวกับสตริง SQL จริงๆมีเหตุผลใดบ้างที่คุณไม่ใช้การสืบค้นแบบพาราเมตริกแทน
svick

1
"เรามีสตริงจำนวนมากในหลายบรรทัดโดยใช้สตริงคำต่อคำ (ส่วนใหญ่เป็นคำสั่ง SQL)" ดูเหมือนว่าคุณมีสตริง SQL จำนวนมากที่เปิดใช้งานการโจมตีด้วยการแทรก SQL
Cetin Basoz

1
@svick เราคือทุกสิ่งที่ผู้ใช้ป้อนจะถูกกำหนดพารามิเตอร์ เรายังคงใช้ไดนามิก SQL เป็นอย่างมากเนื่องจากเราสร้าง SQL แบบไดนามิกสำหรับเอนทิตีของเราในโค้ด
Keith

1
@CetinBasoz เราไม่ - อินพุตของผู้ใช้ทั้งหมดถูกกำหนดพารามิเตอร์ มีหลายสถานการณ์ที่คุณมี SQL แบบไดนามิกเช่น LINQ หรือกรอบการทำแผนที่วัตถุอื่น ๆ
Keith

คำตอบ:


195

คุณสามารถใช้ทั้งสอง$และ@คำนำหน้ากับสตริงเดียวกัน:

string s = $@"Result...
Adding ""{x}"" and {this.Y()} to foobar:
{x.GetLog()}";

นับตั้งแต่มีการแนะนำใน C # 6 , หยันสตริงคำต่อคำจะต้องเริ่มต้นด้วยสัญญาณ$@, แต่เริ่มต้นด้วย C # 8 คุณสามารถใช้อย่างใดอย่างหนึ่ง$@@$หรือ


57
ตรงข้าม ( @$"...") ไม่ทำงานซึ่งทำให้ฉันมาที่นี่
Sinatr

12
@Sinatr ใช่มันจะต้องเป็นไป$@"..."ตามลำดับนั้น
Keith

36
ความจริงที่ว่าได้$@ผลเมื่อ@$ใดไม่สมเหตุสมผลเมื่อคุณคิดถึงมัน เมื่อฉันสับสนเกี่ยวกับสิ่งนี้ซึ่งเกิดขึ้นบ่อยครั้งเมื่อฉันเริ่มใช้ไวยากรณ์นี้ฉันมักจะพูดกับตัวเองเสมอว่า: "Interpolate this verbatim string" สาเหตุที่ตรงกันข้ามจะไม่สมเหตุสมผล
Heki

1
@RayLuo ไม่ได้เป็นอย่างนั้น แต่เมื่อพิจารณาถึงความรวดเร็วของ serialisers .NET JSON ที่หลากหลายกลายเป็นคุณอาจไม่ควรเข้ารหัส JSON โดยตรง
Keith

1
หากใช้ duo กับสิ่งที่มีอยู่const stringให้ปล่อยไฟล์const.
bvj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.