Нужно ли избегать обратной косой черты в конфигурационном файле? - PullRequest
0 голосов
/ 21 января 2019

Скажите, у меня есть следующая строка:

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 голосов
/ 21 января 2019

В дополнение к отличному ответу @ Joey, для путей можно использовать прямую косую черту:

{
  "MyPath": "c:/testmypath"
}

Это обычно довольно хорошо поддерживается.Или, чтобы быть супер безопасным, вы можете просто вернуть их к обычным обратным слешам:

return configuration["MyPath"].Replace("/", @"\");
0 голосов
/ 21 января 2019

C # и JSON - это разные языки с разными синтаксическими правилами (в конце концов, JSON не очень похож на C #), хотя их правила относительно того, как выглядят строки, похожи.

Поскольку вы имеете дело с файлом JSON, правила C # для строк (в частности, для дословных строк) не применяются, но правила JSON применимы. В этих правилах у вас есть , чтобы избежать обратной косой черты как \\ каждый раз. Другого пути нет. В противном случае последовательность \t фактически означает Tab, как вы заметили.

Нет реального способа исправить это после свершившегося факта. В зависимости от символа после \ вы получите что-то, например Tab, или ошибку синтаксического анализа при попытке прочитать файл JSON. Хотя вы можете превратить Tab в \t, если знаете, что имеете дело с путями к файлам, я бы не рекомендовал это делать. Как уже упоминалось, если символ после обратной косой черты не является t, вы все равно можете получить ошибку без возможности восстановления.

Что касается вашей попытки «избежать» неправильной версии на стороне C #: @ имеет различное значение, в зависимости от того, где он используется:

  • @"string" - это дословная строка , в которую можно написать почти все дословно , не беспокоясь о escape-символах. Единственное исключение - "" для двойных кавычек внутри строки. Но на самом деле, он наиболее часто используется и удобен для таких вещей, как пути к файлам в Windows и регулярные выражения, которые довольно неудобно вводить при необходимости экранировать каждую обратную косую черту.
  • @name делает любое ключевое слово или другое имя допустимым идентификатором. Вы можете добавить к каждому идентификатору префикс @, и это сделает действительную программу немного длиннее, но ничего не изменит в ее семантике. Это просто что-то для компилятора, например, например, using директивы.

Хотя обе функции используют один и тот же символ и имеют несколько сравнимые идеи, они не работают одинаково и, конечно, обе не оказывают влияния во время выполнения. Они просто для компилятора.

...