假设我有以下字符串:
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/