จะใช้อักขระ Escape กับการแก้ไขสตริงใน C # 6 ได้อย่างไร


88

ฉันใช้การแก้ไขสตริงและชอบมันมาก แต่ฉันมีปัญหาที่ฉันพยายามรวมแบ็กสแลชในผลลัพธ์ของฉัน แต่ไม่สามารถทำให้มันใช้งานได้

อยากได้อะไรแบบนี้ ..

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{domain}\{userName}"

ฉันต้องการให้ผลลัพธ์ของคำสั่งผสมเป็น

myDomain\myUserName

สิ่งที่ฉันได้รับคือข้อผิดพลาดทางไวยากรณ์เกี่ยวกับ \ เป็นอักขระหลีก ถ้าฉันใส่ \\ ข้อผิดพลาด snytax จะหายไป แต่ผลลัพธ์คือ myDomain \\ myUsername

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


ขอบคุณ. แต่ฉันไม่สามารถใช้การแก้ไขสตริง? ฉันไม่อยากหนีทุกอย่าง ฉันแค่ต้องการใช้แบ็กสแลชภายในสตริงที่ถูกสอดแทรก
Matt

ไม่คุณทำไม่ได้ คำตอบของเขาผิด
greenhoorn

3
รู้สึกเหมือนเป็นข้อบกพร่องสำหรับฉัน;) \\ ควรใช้งานได้
แมตต์

ฉันได้ผลลัพธ์ที่ถูกต้องสำหรับ $ {domain} \\ {userName} .. เป็นเว็บแอปพลิเคชันหรือไม่
greenhoorn

2
คำตอบของ Nhan ดูเหมือนจะทำงานได้อย่างสมบูรณ์แบบ $@"{domain}\{userName}". ฉันคิดว่าคุณควรลองและยอมรับมัน ฉันมีปัญหาเดียวกันทุกประการนอกจากนี้ยังเป็นโดเมนและชื่อผู้ใช้และวิธีการของเขาก็ใช้ได้ดี
ProfK

คำตอบ:


107

การหลีกเลี่ยงด้วยแบ็กสแลช ( \) ใช้ได้กับอักขระทั้งหมดยกเว้นวงเล็บปีกกา

หากคุณกำลังพยายามหลีกเลี่ยงวงเล็บปีกกา ( {หรือ}) คุณต้องใช้{{หรือ}}ตามhttps://msdn.microsoft.com/en-us/library/dn961160.aspx https://msdn.microsoft.com/en-us/library/dn961160.aspx

... การเกิดขึ้นทั้งหมดของวงเล็บปีกกาสองชั้น (“ {{“ และ“}}”) จะถูกแปลงเป็นวงเล็บปีกกาเดี่ยว


มันใช้ไม่ได้กับแบ็กสแลชตามที่ OP อธิบายไว้อย่างชัดเจน
ProfK

80

คุณสามารถทำได้โดยใช้ทั้ง $ @ ลำดับเป็นสิ่งสำคัญ

var combo = $@"{domain}\{userName}";

4
คำตอบที่ง่ายและดีที่สุด ไม่เข้าใจว่าทำไมคนถึงเลือกคำตอบที่ซับซ้อนกว่านี้ ลิงก์ MSDN สำหรับสตริงที่มีการแก้ไขคำต่อคำdocs.microsoft.com/en-us/dotnet/csharp/tutorials/…
Alex34758

3
"เริ่มต้นด้วย C # 8.0 คุณสามารถใช้โทเค็น $ และ @ ในลำดับใดก็ได้" (จากลิงค์ของ Alex ในความคิดเห็นด้านบน)
Casey Plummer

9

เอดูอาร์โดถูกต้อง คุณหลีกเลี่ยงการดัดฟันด้วยการเพิ่มขึ้นเป็นสองเท่า ดังนั้นหากคุณต้องการส่งออกตัวแปรโดเมนเป็น {mydomain} คุณจะต้องทำ:

$"{{{domain}}}";

นอกจากนี้สมมติว่าวันที่ปัจจุบันคือ 1 กันยายน 2016 ให้ดำเนินการดังนี้:

$"The date is {DateTime.Now}";

จะแสดงผลบางอย่างเช่น "วันที่คือ 2016/09/01 15:04:48 น." ขึ้นอยู่กับการแปลของคุณ คุณยังสามารถจัดรูปแบบวันที่ได้โดยทำดังนี้

$"The date is {DateTime.Now : MMMM dd, yyyy}";

ซึ่งจะแสดงผล "วันที่คือวันที่ 1 กันยายน 2016" สตริง Interpolated อ่านได้ง่ายกว่ามาก คำตอบที่ดี Eduardo


1
OP ไม่ได้พยายามที่จะหลีกเลี่ยงวงเล็บปีกกา พวกเขาระบุอย่างชัดเจนว่าพวกเขากำลังพยายามหลีกเลี่ยงเครื่องหมายแบ็กสแลชและปกติ "\\" ไม่ทำงานในสตริงที่ถูกแทรก
ProfK

3
ฉันไม่สนใจว่า OP กำลังขออะไรฉันต้องการหลีกเลี่ยงวงเล็บปีกกาและรายการแรกของ Google คือสิ่งนี้ หัวเรื่อง OP ทำให้ Google เข้าใจผิดดังนั้นนี่จึงเป็นคำตอบที่ถูกต้องและสมควรได้รับการโหวต
AndrewBenjamin

4
$"{domain}\\{user}"

ทำงานได้ดี - การหลบหนีทำงานได้ตามปกติ (ยกเว้นเมื่อหลบหนี{) อย่างน้อยบน. NET 4.6 และ VS 14.0.22823 D14REL

หากไม่ได้ผลด้วยเหตุผลบางประการ (คุณอาจใช้คอมไพเลอร์รุ่นเก่ากว่านี้หรือไม่) คุณสามารถลองพูดให้ชัดเจนยิ่งขึ้น:

$"{domain}{@"\"}{user}"

นั่นคือสิ่งที่ฉันคิดเหมือนกัน ที่น่าสนใจบน surface pro 3 ของฉันรหัสทำงานได้ดีกับ \\ หรือ Explicit @ "\" ปกติ แต่ในเครื่องทำงานของฉันไม่ได้ ดังนั้นฉันคิดว่าคุณอาจโดนตะปูบนหัวเกี่ยวกับเวอร์ชันที่ติดตั้ง เครื่องทำงานของฉันแจ้งว่าไม่มีการอัปเดต แต่น่าเสียดาย ดังนั้นคำถามของฉันสำหรับคุณคือฉันจะกำหนดเวอร์ชัน / build ของ. net 4.6 บนเครื่องของฉันได้อย่างไร? สิ่งต่างๆดูเหมือนจะเปลี่ยนไปเล็กน้อยในเรื่องนี้ฉันไม่สามารถหาคำแนะนำเกี่ยวกับหมายเลขรุ่น / เวอร์ชันได้มากนัก
Matt

จากสิ่งที่ฉันสามารถบอกได้ว่าฉันใช้. net และเทียบกับ 2015 RC เวอร์ชันเดียวกันบนทั้งสองเครื่อง ความแตกต่างเดียวที่ฉันคิดได้คือเครื่องที่ทำงานได้ตามที่คาดไว้ (SP3) กำลังเรียกใช้การแสดงตัวอย่างภายในล่าสุดของ windows 10 ฉันเชื่อว่า. net framework มาพร้อมกับสิ่งนี้ดังนั้นฉันอาจมีเวอร์ชันที่ใหม่กว่าที่นั่น ฉันไม่รู้วิธีตรวจสอบโดยเฉพาะ
Matt

อัปเดตดูในโฟลเดอร์ c: \ windows \ microsoft.net \ framework64 \ v4.0.30319 ที่รายละเอียดคุณสมบัติสำหรับ clr.dll ฉันเห็นความแตกต่าง เวอร์ชันบนพื้นผิวของฉันคือ 4.6.79.0 และเวอร์ชันบนเครื่องที่ทำงานของฉันคือ 4.6.57.0 คำถามของฉันคือตอนนี้ฉันจะอัปเกรดจาก 4.6.57.0 เป็น 4.6.79.0 ได้อย่างไร (ทำไมเป็นแบบนี้ยากมากเลย!;)
แมตต์

@Matt ฉันไม่คิดว่ามันจะเป็นเช่นนั้นฉันมี 4.6.57.0 และใช้งานได้ดี เป็นไปได้ไหมที่คุณติดตั้งส่วนขยาย Visual Studio ซึ่งทำให้สิ่งต่าง ๆ ยุ่ง
Luaan

ในกรณีที่คุณสังเกตเห็นความแตกต่างในลักษณะการทำงานแม้ว่าจะไม่เห็นการอัปเดตใด ๆ อาจพิจารณาใช้แพ็คเกจ NuGet "Microsoft.Net.Compilers" ในโครงการที่ใช้คุณลักษณะ C # ล่าสุด วิธีนี้อาจแก้ไขความแตกต่างที่สังเกตได้ในพฤติกรรม มันทำในโครงการของเรา
Manfred

3

สวัสดีกฎสำหรับการหลีกเลี่ยงเครื่องหมายทับหลังในสตริงที่ถูกสอดแทรกนั้นซ้ำกับเครื่องหมายทับหลัง:

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{domain}\\{userName}";

เอาต์พุตคอนโซล

แต่ถ้าคุณใช้สตริงที่ถูกแก้ไขเป็นสตริงคำต่อคำคุณก็ไม่จำเป็นต้องหนีเครื่องหมายทับ

var domain = "mydomain";
var userName = "myUserName";
var combo = $@"{domain}\{userName}";

และคุณจะได้รับสิ่งเดียวกัน:

เอาต์พุตคอนโซล

สำหรับบทช่วยสอนเกี่ยวกับสตริงที่ถูกแทรก: ดูวิดีโอที่สอดแทรกสตริง


0

ถ้าฉันไม่เข้าใจผิด วิธีแก้ปัญหานั้นง่ายจริง

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{{{domain}}}\\{{{userName}}}";
Console.WriteLine(combo);

ฉันแบ่งปันคำตอบของ birdamongmen และข้อมูลอ้างอิงที่ดีที่มี หวังว่าจะเป็นประโยชน์กับคุณ 5 เซ็นต์ของฉัน


1
คุณเข้าใจผิด OP ไม่ได้พยายามที่จะหลีกเลี่ยงวงเล็บปีกกา พวกเขาระบุอย่างชัดเจนว่าพวกเขากำลังพยายามหลีกเลี่ยงเครื่องหมายแบ็กสแลชและปกติ `\\` ไม่ทำงานในสตริงที่ถูกสอดแทรก
ProfK

-2

คุณสามารถใช้สิ่งนี้ -

'First, declare the curley braces as chars
        Dim LeftBrace As Char = "{"
        Dim RightBrace As Char = "}"

        'Then in your string, use like this-
        Dim myStr As String = $"This is a {LeftBrace}String{RightBrace}"

        'Now, the output will be
        ' This is a {string}code here

1
นี่ไม่ใช่ C #? (แต่ VB.NET?)
Julian

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