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

标签 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(),虽然我不确定为什么我认为它会起作用。

最佳答案

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

由于您处理的是 JSON 文件,因此 C# 的字符串规则(尤其是逐字字符串)不适用,但 JSON 的规则适用。在这些规则中,您必须每次都将反斜杠转义为 \\。没有别的办法。否则序列 \t 实际上表示 Tab,如您所见。

事后没有真正的方法来解决这个问题。根据 \ 之后的字符,您会得到一些东西,例如制表符,或者在尝试读取 JSON 文件时遇到解析错误。如果你知道你正在处理文件路径,你可以将 Tab 变回 \t 我不推荐它。如前所述,如果反斜杠后的字符不是 t,您可能会遇到错误而无法恢复。

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

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

虽然这两个功能使用相同的字符并且有一些类似的想法,但它们的工作原理并不相同,当然,两者在运行时都没有影响。它们仅供编译器使用。

关于c# - 是否有必要在配置文件中转义反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54285987/

相关文章:

c# - Visual Studio在azure中的wwwroot内部署文件夹在哪里

configuration - 以符合人体工程学的方式进行配置处理的 lib

c - 结构合法值约束配置继承

c# - 如何在nlog中发送彩色邮件

c# - 如何将多个程序集合并为一个程序集?

c# - .NET 应用程序链接器的状态(又名 "Please Sir, May I have a Linker"2009 版)

configuration - FitNesse 配置文件

c# - 验证用户输入和类型

azure - 如何使用身份表为现有 Azure 数据库创建 ASP.NET Core Web 应用程序

c# - appsettings.json 中的 ASP.NET Core 强类型选项