ฉันมีรุ่นทดลองของ Resharper และมันมักจะแนะนำว่าฉันเปลี่ยนสายปกติเพื่อสตริงคำต่อคำ อะไรคือความแตกต่าง?
ฉันมีรุ่นทดลองของ Resharper และมันมักจะแนะนำว่าฉันเปลี่ยนสายปกติเพื่อสตริงคำต่อคำ อะไรคือความแตกต่าง?
คำตอบ:
สตริงคำต่อคำเป็นสิ่งที่ไม่จำเป็นต้องหลบหนีเช่นชื่อไฟล์:
string myFileName = "C:\\myfolder\\myfile.txt";
อยากจะเป็น
string myFileName = @"C:\myfolder\myfile.txt";
สัญลักษณ์ @ หมายถึงการอ่านสตริงนั้นอย่างแท้จริงและไม่ตีความอักขระควบคุมเป็นอย่างอื่น
สิ่งนี้ครอบคลุมอยู่ในส่วน 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
พวกเขาทั้งสองประเภท
ไม่มีความแตกต่างรันไทม์ระหว่างสตริงและสตริงคำต่อคำ พวกมันต่างกันในเวลารวบรวมเท่านั้น คอมไพเลอร์ยอมรับลำดับ 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);
คุณสามารถมีสตริงหลายบรรทัดได้เช่นกันโดยใช้สตริงคำต่อคำ:
Console.WriteLine(@"This
is
a
Test
for stackoverflow");
โดยที่@
คุณไม่มีข้อผิดพลาด
ใน VB14 มีคุณสมบัติใหม่ที่เรียกว่าMultiline Strings
มันเหมือนสตริงคำต่อคำใน C #
เคล็ดลับสำหรับมืออาชีพ: ตัวอักษรสตริงของ VB ตอนนี้เหมือนกับสตริง C # verbatim ทุกประการ
สตริงปกติใช้ลำดับ 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\\.");
หากคุณต้องการลบคำเตือน Resharper คุณสามารถใช้:
Localizable(false)
สำหรับสิ่งต่างๆเช่นพารามิเตอร์ตำแหน่งไฟล์เช่น นี่อาจเป็นทางออกที่ดี