是否有必要在配置文件中转义反斜杠

时间:2019-01-21 08:34:14

标签: c# asp.net-core configuration .net-core

说我有以下字符串:

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(),但不确定为什么会这样。

2 个答案:

答案 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("/", @"\");