ความแตกต่างระหว่างสตริงปกติและสตริงคำต่อคำคืออะไร?


166

ฉันมีรุ่นทดลองของ Resharper และมันมักจะแนะนำว่าฉันเปลี่ยนสายปกติเพื่อสตริงคำต่อคำ อะไรคือความแตกต่าง?


3
ฉันไม่เคยเห็นคำแนะนำนี้จาก ReSharper คุณสามารถยกตัวอย่างที่แสดงให้เห็นสิ่งนี้ได้หรือไม่?
John Saunders

3
ฉันเพิ่งได้รับมัน ข้อเสนอแนะแรกคือการย้ายไปยังทรัพยากร แต่ที่สองคือการทำให้สตริงคำต่อคำ: MessageBox.Show ("ตุ่นปากเป็ดจะต้อง petted ก่อนที่งานจะสามารถดำเนินการต่อ");
B. Clay Shannon

ฉันยังรับมันอยู่ตลอดเวลา โดยทั่วไปแล้วจะเป็นหนึ่งในคำเตือนของผู้ตรวจสอบซ้ำที่คุณต้องการปิดเพราะแนะนำให้ทำคำต่อคำแบบไม่มีเหตุผลไม่ว่าด้วยเหตุผลใดก็ตาม
Dean Swiatek

ถ้าคุณชอบคุณสมบัติที่แนะนำของฉันสำหรับ Visual Studio IDE โปรด upvote ที่นี่: developercommunity.visualstudio.com/idea/602807/…
Olivier Jacot-Descombes

คำตอบ:


191

สตริงคำต่อคำเป็นสิ่งที่ไม่จำเป็นต้องหลบหนีเช่นชื่อไฟล์:

string myFileName = "C:\\myfolder\\myfile.txt";

อยากจะเป็น

string myFileName = @"C:\myfolder\myfile.txt";

สัญลักษณ์ @ หมายถึงการอ่านสตริงนั้นอย่างแท้จริงและไม่ตีความอักขระควบคุมเป็นอย่างอื่น


12
ฉันสงสัยว่าทำไม Resharper ถึงแนะนำการเปลี่ยนแปลงนี้ ผู้เชี่ยวชาญด้าน CLR ทราบหรือไม่ว่าสายอักขระคำต่อคำถูกประมวลผลอย่างมีประสิทธิภาพมากขึ้นหรือไม่เนื่องจากอักขระละเว้นสามารถละเว้นได้?
Matt Peterson

9
ฉันคิดว่าบางที ReSharper แนะนำเพราะสตริงคำต่อคำสามารถอ่านได้มากกว่า
andyp

36
ฉันเชื่อว่าเป็นรูปแบบการเข้ารหัส (ฉันไม่เคยเห็นหรือเคยได้ยินมาก่อน) สำหรับสตริง ReSharper แนะนำให้ย้ายมันลงในไฟล์ทรัพยากรสำหรับการโลคัลไลซ์หรือเพื่อให้เป็นคำต่อคำ - สำหรับสตริงคำต่อคำ ReSharper จากนั้นจะไม่มีตัวเลือกให้แปลสตริง ดังนั้นดูเหมือนว่าการประชุมเพื่อให้สายทั้งหมดที่ไม่จำเป็นต้องใช้คำต่อคำแปล
Daniel Brückner

สมมติว่าเรามีตัวอักษรสตริงที่กำหนดให้กับตัวแปรสตริงสตริง myFileName = "C: \\ myfolder \\ myfile.txt"; ตอนนี้ฉันต้องการแปลงตัวแปรสตริง myFileName เป็นสตริงคำต่อคำ ฉันต้องทำอย่างไร? มันใช้ได้ไหม? string verbatimStr = @myFileName;
sanjeev bhusal

3
@sanjeevbhusal: คุณไม่เคยทำแบบนั้น @ "C: \ myfolder \ myfile.txt" และ "C: \\ myfolder \\ myfile.txt" เป็นสิ่งเดียวกันกับ CLR มันเป็นเพียงน้ำตาลเชิงประโยค
alc6379

68

สิ่งนี้ครอบคลุมอยู่ในส่วน 2.4.4.5 ของข้อกำหนด C # :

2.4.4.5 ตัวอักษรสตริง

C # รองรับสองรูปแบบของตัวอักษรสตริง: ตัวอักษรสตริงปกติและตัวอักษรสตริงคำต่อคำ

สตริงตัวอักษรปกติประกอบด้วยอักขระศูนย์หรือมากกว่าที่อยู่ในเครื่องหมายคำพูดคู่เช่นเดียวกับใน "hello" และอาจรวมทั้ง escape sequences แบบง่าย (เช่น \ t สำหรับอักขระแท็บ) และลำดับเลขฐานสิบหกและ Unicode

สตริงตัวอักษร verbatim ประกอบด้วยอักขระ @ ตามด้วยอักขระเครื่องหมายคำพูดคู่, ศูนย์หรือมากกว่าอักขระและอักขระเครื่องหมายคำพูดคู่ปิด ตัวอย่างง่ายๆคือ @ "hello" ในสตริงตัวอักษรคำต่อคำตัวอักษรระหว่างตัวคั่นจะถูกตีความคำต่อคำยกเว้นเพียงข้อเดียวคือ โดยเฉพาะอย่างยิ่ง escape sequences อย่างง่ายและ hexadecimal และ Unicode escape sequences จะไม่ถูกประมวลผลในตัวอักษรสตริง verbatim สตริงตัวอักษรคำต่อคำอาจขยายหลายบรรทัด

กล่าวอีกนัยหนึ่งอักขระพิเศษเฉพาะใน @ "ตัวอักษรคำต่อคำสตริง" คืออักขระเครื่องหมายคำพูดคู่ หากคุณต้องการเขียนสตริงคำต่อคำที่มีเครื่องหมายคำพูดคู่คุณต้องเขียนเครื่องหมายคำพูดคู่สองตัว ตัวละครอื่น ๆ ทั้งหมดถูกตีความอย่างแท้จริง

คุณสามารถมีบรรทัดใหม่ตามตัวอักษรในสตริงตัวอักษรคำต่อคำ ในสตริงตัวอักษรปกติคุณไม่สามารถมีบรรทัดใหม่ตามตัวอักษร "\n"แต่คุณต้องใช้ตัวอย่างเช่น

ตัวอักษรสตริงคำต่อคำมักจะมีประโยชน์สำหรับการฝังชื่อไฟล์และนิพจน์ปกติในซอร์สโค้ดเพราะแบ็กสแลชในสตริงประเภทนี้เป็นเรื่องปกติและจะต้องมีการหลบหนีหากใช้ตัวอักษรสตริงปกติ

มีความแตกต่างที่รันไทม์ระหว่างสตริงที่สร้างขึ้นจากตัวอักษรของสตริงปกติและสตริงสร้างขึ้นจากตัวอักษรของสตริงคำต่อคำไม่เป็น - System.Stringพวกเขาทั้งสองประเภท


27

ไม่มีความแตกต่างรันไทม์ระหว่างสตริงและสตริงคำต่อคำ พวกมันต่างกันในเวลารวบรวมเท่านั้น คอมไพเลอร์ยอมรับลำดับ escape น้อยลงในสตริง verbatim ดังนั้น what-you-see-is-what-you-get อื่นนอกเหนือจาก quote quote

คุณยังสามารถใช้อักขระ verbatim @ เพื่อบอกคอมไพเลอร์ให้ใช้คำสำคัญเป็นชื่อ:

var @if = "if";
//okay, treated as a name
Console.WriteLine(@if);
//compiler err, if without @ is a keyword
Console.WriteLine(if);

var @a = "a";
//okay
Console.WriteLine(@a);
//also okay, @ isn't part of the name
Console.WriteLine(a);

16

คุณสามารถมีสตริงหลายบรรทัดได้เช่นกันโดยใช้สตริงคำต่อคำ:

Console.WriteLine(@"This
    is
    a
    Test
    for stackoverflow");

โดยที่@คุณไม่มีข้อผิดพลาด

ใน VB14 มีคุณสมบัติใหม่ที่เรียกว่าMultiline Stringsมันเหมือนสตริงคำต่อคำใน C #

สาย Multiline

เคล็ดลับสำหรับมืออาชีพ: ตัวอักษรสตริงของ VB ตอนนี้เหมือนกับสตริง C # verbatim ทุกประการ


13

สตริงปกติใช้ลำดับ escape พิเศษเพื่อแปลเป็นอักขระพิเศษ

/*
This string contains a newline
and a tab    and an escaped backslash\
*/
Console.WriteLine("This string contains a newline\nand a tab\tand an escaped backslash\\");

สตริงคำต่อคำถูกตีความตามที่เป็นอยู่โดยไม่ต้องแปลลำดับ escape ใด ๆ :

/* 
This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.
*/
Console.WriteLine(@"This string displays as is. No newlines\n, tabs\t or backslash-escapes\\.");

0

หากคุณต้องการลบคำเตือน Resharper คุณสามารถใช้:

Localizable(false)

สำหรับสิ่งต่างๆเช่นพารามิเตอร์ตำแหน่งไฟล์เช่น นี่อาจเป็นทางออกที่ดี

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