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

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

问题描述:

的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“

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

+0

如果使用'Environment.NewLine',会发生什么? – DaveDev 2010-09-03 00:19:05

+0

我不能把'Environment.NewLine'放在我的App.config中 – JohnB 2010-09-03 00:30:26

+2

https://connect.microsoft.com/VisualStudio/feedback/details/594160/consider-displaying-strings-in-the-debugger-without-escaping – Timwi 2010-09-03 02:07:43

如果你正在阅读从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> 

编译罚款和产生正确的结果。

+0

这两个问题都绝对正确:#1从App.config(AKA XML文件)读取等价于'@“”',因为它隐式地转义了字符“#”,#2只是在回车中输入回车.config修复了我的问题。谢谢。 *(JaredPar的答案与我的问题无关。)* – JohnB 2010-09-03 01:01:56

+0

另外,JaredPar是正确的。调试器用'“\\ r \\ n”'显示'value1',这是从App.config中读入后的实际值。但是,调试器通过隐藏额外的斜线来显示'Dictionary'内容:'“\ r \ n”' – JohnB 2010-09-03 13:46:31

该字典没有对您的字符串做任何事情。调试器,或更具体的表达式评估器,当它包含换行符时,将改变显示字符串的格式。最终目标是使其在调试器通常具有的值的单行上更好地显示。

我最近做了一个博客帖子里面将详细介绍什么调试程序和设计背后的原因

编辑

我相信这是一个您的示例代码中存在缺陷。我认为你离开@符号的字典添加的值。如果没有@这个符号,我不会得到你的repro,但是我会这样做。假设@虽然丢失...

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

+0

谢谢,但我并不完全相信。我的问题是,我不希望额外的斜线添加到我的换行符。 – JohnB 2010-09-03 00:01:57

+0

@JohnB,增加了更多的上下文来解释为什么会出现双斜线。 – JaredPar 2010-09-03 00:05:42

+0

我没有使用@“” - 我明白,@会为您转义特殊字符。我稍后会做更多的测试,现在我必须离开。谢谢。 – JohnB 2010-09-03 00:19:11