Why does Boolean.ToString output “True” and not “true”
1 2 3 4 5 6 | true.ToString() false.toString(); Output: True False |
它是"真"而不是"真"有正当理由吗?当XML的布尔类型为小写时,它会中断,并且与C的true/false不兼容(但不确定CLS)。
更新
这是我在C(用于XML)中绕过它的非常老套的方法。
1 2 3 4 | internal static string ToXmlString(this bool b) { return b.ToString().ToLower(); } |
当然,这会在堆栈中再添加一个方法,但会在任何地方删除toLowers()。
只有来自微软的人才能真正回答这个问题。不过,我想提供一些有趣的事实;)
首先,这是它在msdn中关于boolean.toString()方法所说的:
Return Value
Type: System.String
TrueString if the value of this
instance is true, or FalseString if
the value of this instance is false.Remarks
This method returns the
constants"True" or"False". Note that
XML is case-sensitive, and that the
XML specification recognizes"true"
and"false" as the valid set of
Boolean values. If the String object
returned by the ToString() method
is to be written to an XML file, its
String.ToLower method should be
called first to convert it to
lowercase.
有趣的事实是:它根本不会返回真实或虚假的字符串。它使用硬编码的文字"真"和"假"。如果它使用这些字段,对您没有任何好处,因为它们被标记为只读,所以不会更改它们。
另一种方法boolean.toString(iformatProvider)更有趣:
Remarks
The provider parameter is reserved. It does not participate in the execution of this method. This means that the Boolean.ToString(IFormatProvider) method, unlike most methods with a provider parameter, does not reflect culture-specific settings.
解决办法是什么?取决于你到底想做什么。不管它是什么,我敢打赌它需要黑客;)
…因为.NET环境旨在支持多种语言。
boolean(mscorlib.dll中)被设计为在内部由语言使用,以支持布尔数据类型。C使用所有小写字母作为关键字,因此"bool"、"true"和"false"。
然而,vb.net使用标准大小写:因此"boolean"、"true"和"false"。
因为语言必须一起工作,所以不能让true.toString()(c)为true.toString()(vb.net)提供不同的结果。clr设计人员为toString()结果选择了标准的clr大小写表示法。
Boolean true的字符串表示形式定义为Boolean.Truestring。
(有一个与System.String类似的例子:c将其表示为"String"类型)。
对于XML,可以使用xmlconvert.toString方法。
将其转换为所有小写的代码很简单。
然而,将"真"转换回"真"并不是那么简单。
1 | true.ToString().ToLower() |
是我用于XML输出的。
它是如何与C不兼容的?boolean.parse和boolean.typarse不区分大小写,通过将值与"true"和"false"的boolean.truestring或boolean.falsestring进行比较来完成分析。
编辑:在Reflector中查看Boolean.ToString方法时,发现字符串是硬编码的,因此ToString方法如下:
1 2 3 4 5 6 7 8 | public override string ToString() { if (!this) { return"False"; } return"True"; } |
我知道为什么这种方式已经被解决了,但是当涉及到"自定义"布尔格式时,我有两个扩展方法,我不能再没有它们了:—)
1 2 3 4 5 6 7 8 9 | public static class BoolExtensions { public static string ToString(this bool? v, string trueString, string falseString, string nullString="Undefined") { return v == null ? nullString : v.Value ? trueString : falseString; } public static string ToString(this bool v, string trueString, string falseString) { return ToString(v, trueString, falseString, null); } } |
用法很简单。下面将各种bool值转换为其葡萄牙语表示形式:
1 2 3 4 | string verdadeiro = true.ToString("verdadeiro","falso"); string falso = false.ToString("verdadeiro","falso"); bool? v = null; string nulo = v.ToString("verdadeiro","falso","nulo"); |
维基百科:"可扩展标记语言(XML)是一种标记语言,它定义了一组规则,用于以人可读和机器可读的格式对文档进行编码。"
人的可读性是主观的,但在XML看来,使用"一"这个词代替数字"1"是首选。您会注意到使用枚举会发生这种情况,因为单词将被序列化而不是其值("FirstOption"而不是"0"或"1")。
同样,文本通常遵循camelscaping。因此,XML不使用"字符串",而是使用"字符串"。这就是为什么boolean.truestring默认为"true",boolean.falseString默认为"false"。
这可能是源于旧的vb而非.NET时代,bool.toString产生了对或错。