说我有以下字符串:
c:\testmypath
在C#中,如果我想在内部代码中使用它而没有出现标签,则可以执行以下操作:
string t = @"c:\testmypath";
但是,如果我想从配置文件中读取它;假设appsettings.json
如下所示:
{
"MyPath": "c:\testmypath"
}
以下代码导致在控制台中显示一个选项卡:
static void Main(string[] args)
{
var path = returnString();
Console.WriteLine(path);
Console.ReadLine();
}
static string returnString()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
var configuration = builder.Build();
return configuration["MyPath"];
}
我可以通过转义配置文件中的路径来解决此问题;例如:
{
"MyPath": "c:\\testmypath"
}
通过,我可以以某种方式转义单个斜杠版本吗?我尝试过:
return @configuration["MyPath"];
令我惊讶的是,确实可以编译,但是没有效果。我也尝试过.ToString()
,但不确定为什么会这样。
答案 0 :(得分:2)
C#和JSON是具有不同语法规则的不同语言(毕竟,JSON与C#不太相似),尽管它们关于字符串外观的规则有点相似。
由于您要处理JSON文件,因此C#的字符串规则(尤其是普通字符串)不适用,但JSON的规则适用。在这些规则中,您必须每次都转义为\\
的反斜杠。没有别的办法了。否则,正如您所注意到的,序列\t
实际上表示Tab。
事后没有解决此问题的真正方法。根据{{1}}之后的字符,您会得到一些东西,例如Tab,或者在尝试读取JSON文件时得到解析错误。如果您知道要处理的是文件路径,可以将Tab改回\
,但我不建议这样做。如前所述,如果反斜杠后面的字符不是\t
,则无论如何您都可能会遇到错误而无法恢复。
对于您尝试在C#端“转义”错误版本的尝试:t
具有不同的含义,具体取决于使用的位置:
@
是一个 verbatim字符串,几乎所有内容都可以写成 verbatim ,而不必担心转义字符。唯一的例外是@"string"
用于字符串内的双引号。但是确实,对于Windows上的文件路径和正则表达式之类的东西来说,它是最常用且最方便的方式,当不得不转义每个反斜杠时,这两种输入都相当烦人。""
使任何关键字或其他名称成为有效的标识符。您可以为每个标识符加上@name
前缀,这会使有效程序稍长一些,但不会改变其语义。对于编译器来说,这纯粹是东西,例如@
指令。尽管这两个功能使用相同的字符并具有一些可比的想法,但它们的工作原理不同,并且当然对运行时没有影响。它们仅用于编译器。
答案 1 :(得分:0)
除了@Joey的出色答案外,对于路径,您可以使用正斜杠:
{
"MyPath": "c:/testmypath"
}
通常对此功能有很好的支持。为了安全起见,您可以将它们恢复为常规的反斜杠:
return configuration["MyPath"].Replace("/", @"\");