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

6 c# configuration .net-core asp.net-core

假设我有以下字符串:

c:\testmypath
Run Code Online (Sandbox Code Playgroud)

在 C# 中,如果我想在没有标签的情况下使用内部代码,我可以执行以下操作:

string t = @"c:\testmypath";
Run Code Online (Sandbox Code Playgroud)

但是,如果我想从配置文件中读取它;假设一个appsettings.json看起来像这样:

{
  "MyPath": "c:\testmypath"
}
Run Code Online (Sandbox Code Playgroud)

以下代码导致在控制台中显示一个选项卡:

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"];            
}
Run Code Online (Sandbox Code Playgroud)

我可以通过转义配置文件中的路径来解决这个问题;例如:

{
  "MyPath": "c:\\testmypath"
}
Run Code Online (Sandbox Code Playgroud)

通过,我可以以某种方式逃避单斜杠版本吗?我试过了:

return @configuration["MyPath"];            
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,它确实可以编译,但没有任何效果。我也试过.ToString(),虽然我不确定为什么我认为这会奏效。

Joe*_*oey 6

C# 和 JSON 是具有不同句法规则的不同语言(毕竟,JSON 看起来不像 C#),尽管它们关于字符串外观的规则有点相似。

由于您正在处理 JSON 文件,因此 C# 的字符串规则(特别是逐字字符串)不适用,但 JSON 的规则适用。在这些规则中,您必须\\每次一样逃避反斜杠。没有其他办法。否则\t,正如您所注意到的,序列实际上意味着 Tab。

事后没有真正的方法来解决这个问题。取决于\您获得某些东西后的字符,例如 Tab,或者在尝试读取 JSON 文件时出现解析错误。\t如果您知道您正在处理文件路径,则可以将 Tab 变回,但我不推荐它。如前所述,如果反斜杠后面的字符不是 a t,则无论如何您都可能会收到错误而无法恢复。

至于您在 C# 方面“转义”错误版本的尝试:@具有不同的含义,具体取决于它的使用位置:

  • @"string"是一个逐字字符串,其中几乎可以逐字写入任何内容而不必担心转义字符。唯一的例外是""字符串内的双引号。但实际上,它最常用和方便,例如 Windows 上的文件路径和正则表达式,当必须转义每个反斜杠时,这两者都非常烦人。
  • @name使任何关键字或其他名称成为有效标识符。您可以为每个标识符加上前缀@,这会使有效程序稍长一些,但不会改变其语义的任何内容。它纯粹是编译器的东西,类似于例如using指令。

虽然这两个特性使用相同的特性并且有一些类似的想法,但它们的工作方式并不相同,当然,它们在运行时都没有影响。它们仅用于编译器。