Почему мой словарь добавляет дополнительные escape-символы в строку? - PullRequest
2 голосов
/ 03 сентября 2010

App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="1" value="An error occured.\r\nPlease try again later." />
  </appSettings>
</configuration>

Код:

Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
string key = "1";

keyValuePairs.Add(key, ConfigurationManager.AppSettings["key"]);

if (keyValuePairs.ContainsKey(key))
{
  // when I hover over the object, keyValuePairs, in my debugger, I see, "An error occured.\r\nPlease try again later."
  string value1 = keyValuePairs[key];
  // now when I hover over the local variable, value, I see, "An error occured.\\r\\nPlease try again later."
}

Мне интересно, почему приведенный выше код добавляет escape-символы в "\ r \ n"чтобы сделать это "\ r \ n"

Я также хотел бы знать, как избежать получения дополнительных "\" символов.

Ответы [ 2 ]

6 голосов
/ 03 сентября 2010

Словарь ничего не делает с вашей строкой.Отладчик, или, точнее, средство оценки выражений, будет изменять формат отображаемой строки, если она содержит символы новой строки.Конечная цель - сделать так, чтобы он лучше отображался в одной строке, которую обычно имеет отладчик для значений.

Недавно я сделал пост в блоге, в котором подробно рассказывается о том, что делает отладчик, и о причине дизайна

EDIT

Я полагаю, что в вашем примере кода есть ошибка.Я думаю, что вы оставили символ @ вне значения в добавлении словаря.Без символа @ я не получаю твоего воспроизведения, но я получаю его.Предполагая, что @ отсутствует ...

Причина, по которой вы видите строку с дополнительными escape-символами, заключается в том, что отладчик всегда отображает строки в виде строковых литералов, а не дословных строк.В строковом литерале вам нужно двойное экранирование, чтобы соответствовать эквивалентному коду в дословной строке.Следовательно \n становится \\n

2 голосов
/ 03 сентября 2010

Если вы читаете строку из app.config, я предполагаю, что это что-то вроде следующего:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="errorString" value="An error occured.\r\nPlease try again later."/>
  </appSettings>
</configuration>

В этом случае ваш пример кода должен выглядеть следующим образом:

keyValuePairs.Add("1", @"An error occured.\r\nPlease try again later.");

И оттуда должно быть очевидно, почему отладчик отображает как он есть (особенно если вы читаете ответ JaredPar .

Вам лучше использовать словарь ресурсов для хранения строки, что позволит вам легко вставлять символы новой строки в редакторе VS.

Редактировать: Просто по прихоти я попробовал следующее:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="errorString" value="An error occured.
Please try again later."/>
  </appSettings>
</configuration>

Скомпилировано отлично и выдает правильные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...