为什么我的词典会在字符串中添加额外的转义字符?

时间:2010-09-02 23:55:33

标签: c# visual-studio string debugging dictionary

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."
}

我很好奇为什么上面的代码将转义字符添加到“\ r \ n”以使其成为“\ r \ n”

我也想知道如何避免获得额外的“\”字符。

2 个答案:

答案 0 :(得分:6)

字典对你的字符串没有任何作用。调试器,或者更具体地说是表达式计算器,将在包含换行符时显示所显示字符串的格式。最终目标是使其在调试器通常具有的值的单行上更好地显示。

我最近做了一篇博文,详细介绍了调试器的作用以及设计背后的原因

修改

我相信您的示例代码中存在错误。我认为你在@符号处留下了添加词典的值。如果没有@符号,我就不会得到你的复制品。假设@虽然遗失了......

您看到带有额外转义的字符串的原因是调试器始终将字符串显示为字符串文字而不是逐字字符串。在字符串文字中,您需要双重转义以匹配逐字字符串中的等效代码。因此\n变为\\n

答案 1 :(得分:2)

如果您正在从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's answer

最好使用资源字典存储字符串,这样可以轻松地在VS编辑器中插入换行符。

编辑:只是一时兴起,我尝试了以下内容:

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

编译好并产生正确的结果。