如何在C#6中使用带转义符的转义符?


86

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

我想要的是这样的..

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

我想要组合的输出是

myDomain\myUserName

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

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


谢谢。但是,我不能使用字符串插值吗?我不想逃避一切。我只想在插值字符串中使用反斜杠。
马特

不,你不能。他的回答是错误的。
greenhoorn

3
感觉对我来说像个小虫;)\\应该可以工作
马特

我得到了$ {domain} \\ {userName}的正确输出。它是Web应用程序吗?
greenhoorn 2015年

2
Nhan的回答似乎很完美。$@"{domain}\{userName}"。我认为您应该尝试一下,并接受它。我遇到了完全相同的问题,甚至是域和用户名,而且他的方法效果很好。
ProfK 16/12/29

Answers:




8

爱德华多是正确的。您可以通过加倍来避开花括号。因此,如果要将域变量输出为{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日”。内插的字符串更具可读性。好的答案爱德华多。


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上,代码可以正常使用\\或显式@“ \”正常工作,但是在我的工作计算机上却不能。因此,我认为您可能已经安装了该版本的产品。不幸的是,我的工作机器说没有可用的更新。因此,我想问的是,我如何确定计算机上.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

@Matt我不这么认为-我也有4.6.57.0,它可以正常工作。是否有可能安装了一些Visual Studio扩展,使事情变得混乱了?
罗安2015年

如果您发现行为有所不同,尽管没有看到任何更新,则可以考虑在使用最新C#功能的项目中使用NuGet包“ Microsoft.Net.Compilers”。这可以解决观察到的行为差异。它确实在我们的项目中。
曼弗雷德

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并不试图逃避花括号。他们清楚地指出,自己正试图转义反斜杠,而普通的\\在插补字符串中
不起作用

-1

您可以使用此-

'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

这不是C#吗?(?但VB.NET)
朱利安

嗯,当vb .net程序员得到他的问题的ac#答案时,这种感觉是一样的。
Vinod KC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.