繁体   English   中英

将C#属性设置为仅空格失败

[英]Setting a C# Properties.Settings value to spaces only fails

似乎Properties.Settings的user.config文件可以使用<value />标记正确处理空字符串值,但是该值仅包含一个或多个空格(例如“”)不会被存储为。 ..

    <value>    </value>

而是...

     <value>
     </value>

并因此包含CRLF和“缩进”空间。

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

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

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

感谢您提供这些建议,但都不能解决问题。 使用CDATA意味着下次将该属性加载到程序中(例如, string prop = Properties.Settings.Default.MyProp ),您将获得CDATA字符串(例如,prop现在为"<![CDATA..." ) 。 如果使用&nbsp;也会发生相同的情况 顺便提一句,PSDSave()将&,<和>自动转换为&amp;, &lt;, and &gt; ;。 实体。

基本上,如果字符串(和char)设置为null或包含至少一个非空格字符,则可以正确保存和恢复它们,但是不能正确保存一个或多个空格(或一个空格的char)字符串。

该问题出现在允许用户设置要用作行缩进前缀的字符串(例如"----", " "等)的程序上。 从那以后,我更改了程序以避免此空格字符串错误,但是在我看来,空格字符串仍然应该是完全有效的“属性”!

对于其他正在寻找如何在配置中保存“ 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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM