仅将 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 现在是 "<![CDATA..."
)。如果使用&nbsp;
,也会发生同样的事情。顺便说一句,P.S.D.Save() 将 &、 自动转换为 &amp;, &lt;, and &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