【问题标题】:How can I use escape characters with string interpolation in C# 6?如何在 C# 6 中使用带有字符串插值的转义字符?
【发布时间】:2015-09-28 17:59:57
【问题描述】:

我一直在使用字符串插值并且喜欢它。但是,我遇到了一个问题,我试图在输出中包含反斜杠,但我无法让它工作。

我想要这样的东西......

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

我希望 combo 的输出是:

myDomain\myUserName

我收到关于 \ 是转义字符的语法错误。如果我输入 \\ 那么语法错误就消失了,但输出是 myDomain\\myUsername

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

【问题讨论】:

  • 谢谢。但是我不能使用字符串插值?我不想逃避一切。我只想在插值字符串中使用反斜杠。
  • 不,你不能。他的答案是错误的。
  • 对我来说感觉像是一个错误 ;) \\ 应该可以工作
  • 我得到了 ${domain}\\{userName} 的正确输出。它是一个 Web 应用程序吗?
  • Nhan 的回答似乎很完美。 $@"{domain}\{userName}"。我认为你应该尝试一下,并接受它。我遇到了完全相同的问题,归根结底也是域名和用户名,他的方法效果很好。

标签: c# .net string-interpolation


【解决方案1】:

你可以用这个-

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

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

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

【讨论】:

  • 这不是 C#? (但是 VB.NET?)
  • 嗯,当一个 vb .net 程序员为他的问题得到一个 c# 答案时,这就是同样的感觉。
【解决方案2】:

在插值字符串中转义反斜杠的规则是复制反斜杠:

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

但是,如果您还使用插值字符串作为逐字字符串,那么您不需要转义反斜杠:

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

你会得到同样的结果:

关于插值字符串的教程(西班牙语):see a video about interpolated strings

【讨论】:

【解决方案3】:

Eduardo is correct。你可以通过加倍来避开花括号。因此,如果您想将域变量输出为 {mydomain},您需要这样做:

$"{{{domain}}}";

此外,假设当前日期是 2016 年 9 月 1 日,这样做:

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

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

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

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

【讨论】:

  • OP 并没有试图逃避花括号。他们清楚地表明他们正在尝试转义反斜杠本身,而普通的 `\\` 在插值字符串中不起作用。
  • 我不在乎 OP 在问什么,我想避开花括号,而第一个谷歌条目就是这个。所以 OP 标题误导了谷歌,因此这是一个有效的答案,值得支持。
【解决方案4】:

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

如果您尝试转义花括号({}),则必须使用 {{}}$ - string interpolation (C# reference)

...所有出现的双花括号(“{{”和“}}”)都将转换为单个花括号。

【讨论】:

  • 正如 OP 明确解释的那样,它本身不适用于反斜杠。
【解决方案5】:

如果我没有误会,解决方法其实很简单:

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

我分享birdamongmen's answer 以及那里提供的良好参考。

【讨论】:

  • 你误会了。 OP 并没有试图逃避花括号。他们清楚地表明他们正在尝试转义反斜杠本身,而普通的 `\\` 在插值字符串中不起作用
【解决方案6】:

您可以这样做,同时使用 $@.顺序很重要。

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

最初的问题特别提到了 C# 6。正如评论的那样,C# 8 不再关心顺序。

【讨论】:

  • 最佳而简单的答案。不明白为什么人们选择更复杂的答案。逐字插值字符串的 MSDN 链接docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
  • “从 C# 8.0 开始,您可以按任意顺序使用 $ 和 @ 标记”(来自上述评论中 Alex 的链接)。
【解决方案7】:
$"{domain}\\{user}"

工作正常 - 转义照常工作(转义 { 时除外)。至少在 .NET 4.6 和 Visual Studio 14.0.22823 D14REL 上。

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

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

【讨论】:

  • 我也是这么想的。有趣的是,在我的 Surface pro 3 上,代码可以正常使用普通 \\ 或显式 @"\",但在我的工作机器上却不行。因此,我认为您可能对安装的版本一针见血。不幸的是,我的工作机器说没有可用的更新。那么,我的问题是如何确定我机器上 .net 4.6 的确切版本/构建?在这方面,事情似乎发生了一些变化,我无法找到关于构建/版本号的太多指导。
  • 据我所知,我在两台机器上运行相同版本的 .net 和 vs 2015 RC。我能想到的唯一区别是按预期工作的机器(SP3)正在运行 Windows 10 的最新内部预览。我相信 .net 框架附带了这个,所以也许我在那里有一个更新的版本。我只是不知道如何具体检查。
  • UPDATE 在 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 扩展程序而搞砸了?
  • 如果您在没有看到任何更新的情况下观察到行为差异,也许可以考虑在使用最新 C# 功能的项目中使用 NuGet 包“Microsoft.Net.Compilers”。这可以解决观察到的行为差异。在我们的项目中确实如此。
猜你喜欢
  • 2015-11-26
  • 1970-01-01
  • 2012-01-26
  • 2017-01-28
  • 2010-11-21
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多