如何在C#6中使用带字符串插值的转义字符?

Mat*_*att 81 .net c# string-interpolation

我一直在使用字符串插值并喜欢它,但我有一个问题,我试图在我的输出中包含反斜杠,但我无法让它工作.

我想要的是这样的......

var domain = "mydomain";
var userName = "myUserName";
var combo = $"{domain}\{userName}"
Run Code Online (Sandbox Code Playgroud)

我想要组合的输出

myDomain\myUserName
Run Code Online (Sandbox Code Playgroud)

我得到的是关于\作为转义字符的语法错误.如果我输入\\那么snytax错误消失了,但输出是myDomain \\ myUsername

如何在插值字符串中包含转义字符?

bir*_*men 89

使用反斜杠(\)转义适用于除大括号外的所有字符.

如果您试图逃避花括号({}),则必须使用{{}}https://msdn.microsoft.com/en-us/library/dn961160.aspx.

...所有出现的双花括号("{{"和"}}")都会转换为单个花括号.


Nha*_*han 73

你可以使用$ @来做到这一点.订单很重要.

var combo = $@"{domain}\{userName}";
Run Code Online (Sandbox Code Playgroud)

  • “从 C# 8.0 开始,您可以按任意顺序使用 $ 和 @ 标记”(来自上述评论中的 Alex 链接)。 (5认同)
  • 最佳和简单的答案。不明白为什么人们选择更复杂的答案。逐字插入字符串的MSDN链接https://docs.microsoft.com/zh-cn/dotnet/csharp/tutorials/string-interpolation#how-to-use-escape-sequences-in-an-interpolated-string (3认同)

Dir*_*uss 12

爱德华多是对的。你可以通过加倍来避开花括号。因此,如果您想将域变量输出为 {mydomain},则需要执行以下操作:

$"{{{domain}}}";
Run Code Online (Sandbox Code Playgroud)

此外,假设当前日期是 2016 年 9 月 1 日,请执行以下操作:

$"The date is {DateTime.Now}";
Run Code Online (Sandbox Code Playgroud)

会输出类似“日期是 2016/09/01 3:04:48 PM”的内容,具体取决于您的本地化。您还可以通过执行以下操作来格式化日期:

$"The date is {DateTime.Now : MMMM dd, yyyy}";
Run Code Online (Sandbox Code Playgroud)

这将输出“日期是 2016 年 9 月 1 日”。内插字符串更具可读性。好的答案爱德华多。

  • 我不在乎 OP 在问什么我想逃避花括号,第一个谷歌条目就是这个。所以OP标题误导了谷歌,因此这是一个有效的答案,值得投票。 (3认同)
  • OP 并没有试图逃避花括号。他们清楚地表明他们试图转义反斜杠本身,并且正常的“\\\”在插入的字符串中不起作用。 (2认同)

Lua*_*aan 5

$"{domain}\\\\{user}"\n
Run Code Online (Sandbox Code Playgroud)\n

工作正常 - 转义像往常一样工作(除了转义时{)。至少在 .NET 4.6 和 Visual\xc2\xa0Studio 14.0.22823 D14REL 上。

\n

如果由于某种原因它不起作用(也许您使用的是旧版本的编译器?),您也可以尝试更明确:

\n
$"{domain}{@"\\"}{user}"\n
Run Code Online (Sandbox Code Playgroud)\n