仅将 C# Properties.Settings 值设置为空格会失败

Posted

技术标签:

【中文标题】仅将 C# Properties.Settings 值设置为空格会失败【英文标题】:Setting a C# Properties.Settings value to spaces only fails 【发布时间】:2013-01-05 22:57:31 【问题描述】:

Properties.Settings 的 user.config 文件似乎可以使用 标签正确处理空字符串值,但无法获取仅包含一个或多个空格的值(例如“    ”)存储为...

    <value>    </value>

而是作为...

     <value>
     </value>

因此包括 CRLF 和“缩进”空格。

如何保存一个或多个空格字符的设置?

【问题讨论】:

【参考方案1】:

如果空格很重要,请使用 CDATA:

<value><![CDATA[    ]]></value>

【讨论】:

很可能不是,因为  是一个 html 实体,在 .NET 配置文件中没有任何意义。即使它可以工作,它也将是一个不同于正常空间的字符。 没错,它是一个 HTML 实体,但是使用 &对于 .config 文件中的 & 符号 :) 因为那也是一个 XML 实体。 感谢这些建议,但都没有解决问题。使用 CDATA 意味着下次将属性加载到程序中时(例如 string prop = Properties.Settings.Default.MyProp),您将获得 CDATA 字符串(例如 prop 现在是“ 到 &、< 和 >。 @JDR:我不能遵守。 CDATA 为我工作。重要的一点是您必须直接在 user.config 中输入它,而不是通过项目属性中的设置选项卡。但是,我必须承认,一旦您尝试将该值保存回来,这将丢失,即除了手动编辑 user.config 之外,没有其他方法可以创建该 CDATA 节点。【参考方案2】:

感谢这些建议,但都没有解决问题。使用 CDATA 意味着下次将属性加载到程序中时(例如,string prop = Properties.Settings.Default.MyProp),您将获得 CDATA 字符串(例如,prop 现在是 "&lt;![CDATA...")。如果使用&amp;nbsp;,也会发生同样的事情。顺便说一句,P.S.D.Save() 将 &、 自动转换为 &amp;amp;, &amp;lt;, and &amp;gt; 实体。

如果字符串(和字符)设置为空或至少包含一个非空格字符,则字符串(和字符)设置将被正确保存和恢复,但一个或多个空格的字符串(或一个空格的字符)未正确保存.

这个问题是由一个程序引起的,该程序允许用户设置一个字符串作为行缩进前缀(例如"----", " "等)。我已经修改了程序以避免这个空格字符串错误,但在我看来,空格字符串仍然应该是一个完全有效的“属性”!

【讨论】:

【参考方案3】:

对于其他将寻找如何在配置中保存“SPACE”的人...

您可以简单地使用 ASCII 表 (http://www.asciitable.com/) 中的十进制值。所以对于空格字符,它的值是 32。一些例子......:

示例 1:

在 App.config 中节省单个空间

配置部分:

<setting name="OneSpaceString" serializeAs="String">
    <value>32</value>
</setting>

应用部分:

char space = Convert.ToChar(int.Parse(Properties.Settings.Default.OneSpaceString));
string stringSpace = space.ToString();

示例 2:

在配置中保存多空格字符串(有很多方法可以做到,但例如......)

配置部分

<setting name="MultiSpaceString" serializeAs="String">
    <value>32;32;32;32</value>
</setting>

应用部分:

char[] spaces = Properties.Settings.Default.MultiSpaceString.GetCharsByDecimal(new char[]  ';' );
string stringSpaces = string.Join(string.Empty, spaces);

//Extension method for getting chars by decimal from our string
public static char[] GetCharsByDecimal(this string inputString, char[] delimiters)
    
        int[] charsDecimals = inputString.Split(delimiters, StringSplitOptions.RemoveEmptyEntries).Select(s => int.Parse(s)).ToArray();
        char[] resultChars = new char[charsDecimals.Length];

        for (int i = 0; i < charsDecimals.Length; i++)
        
            resultChars[i] = Convert.ToChar(charsDecimals[i]);
        

        return resultChars;
    

//Or safer variant of our extension method
public static char[] GetCharsByDecimal(this string inputString)
    
        int[] charsDecimals = Regex.Split(inputString, @"\D+").Select(s => int.Parse(s)).ToArray();
        char[] resultChars = new char[charsDecimals.Length];

        for (int i = 0; i < charsDecimals.Length; i++)
        
            resultChars[i] = Convert.ToChar(charsDecimals[i]);
        

        return resultChars;
    

示例 3:

在配置中保存分隔符(包括空格)

配置部分

<setting name="Delimiters" serializeAs="Xml">
                <value>
                    <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                        <string>59</string>
                        <string>44</string>
                        <string>9</string>
                        <string>45</string>
                        <string>124</string>
                        <string>32</string>
                    </ArrayOfString>
                </value>
            </setting>

应用部分

char[] delimiters = Properties.Settings.Default.Delimiters.Cast<string>().Select(s => Convert.ToChar(int.Parse(s))).ToArray();

【讨论】:

这使得配置文件很难从用户的角度进行配置,也意味着您需要创建额外的代码层来读取或写入任何字符串属性。

以上是关于仅将 C# Properties.Settings 值设置为空格会失败的主要内容,如果未能解决你的问题,请参考以下文章

C# Properties.Settings 属性不设置任何值

如何在 C# 中添加 Properties.Settings.Default

在资源中保存字符串值 [C#] 编辑:不是资源,而是 Properties.Settings

Properties.Settings.Default 存储在哪里?

C# 关于config文件中的usersettings

c# Using Settings under visual studio 2012