2009-01-29 91 views
193
true.ToString() 
false.toString(); 

Output: 
True 
False 

有没有一个有效的理由,它是“真”而不是“真”?将XML编写为XML的布尔类型时,它会中断是小写,并且与C#的真/假不兼容(但对CLS不确定)。为什么Boolean.ToString输出“True”而非“true”

更新

这是我避过它在C#(用于XML使用)的非常哈克的方式

internal static string ToXmlString(this bool b) 
{ 
    return b.ToString().ToLower(); 
} 

当然,增加了1种更多的方法来堆栈的,但是移除ToLowers ()到处都是。

+21

我想用`return b?'替换`return b.ToString()。ToLower();`` “真”:“假”;`。更清洁,更高效,更少依赖于理论上可能依赖于区域设置的方法(尽管它在当前实现中不存在)。 – 2010-09-30 13:09:28

+0

我很高兴我不是唯一一个完全被这个困惑和烦恼的人。顺便说一句,我正在处理同样的问题。 (这是破坏我的XML) – Chris 2011-06-17 19:40:27

+1

当使用RestSharp将对象的公共属性序列化为QueryString以进行REST WebService调用时,这也非常恼人。如果REST API对bools(例如Google Directions API)区分大小写,则会导致API调用失败。 “ – 2014-02-18 23:25:15

回答

136

只有微软的人才能真正回答这个问题。不过,我想提供一些有关有趣的事实;)

首先,这是它在MSDN说的有关Boolean.ToString()方法:

返回值

类型:系统。字符串

TrueString如果 实例的值是真实的,或FalseString如果 这个实例的值是假的。

备注

这个方法返回 常数 “真” 或 “假”。请注意, XML区分大小写,并且XML规范将“真” 和“false”识别为有效的 布尔值集合。如果要将ToString()方法 返回的字符串对象 写入XML文件,则其 String.ToLower方法应该先调用 以将其转换为小写的 。

这里有趣的事实#1:它根本不返回TrueString或FalseString。它使用硬编码的文字“真”和“假”。如果它使用了字段,那么它们不会有任何好处,因为它们被标记为只读,所以不会改变它们。

另一种方法,Boolean.ToString(的IFormatProvider)是更有趣:

备注

provider参数被保留。它不参与执行此方法。这意味着与提供者参数的大多数方法不同,Boolean.ToString(IFormatProvider)方法不反映文化特定的设置。

什么是解决方案?取决于你想要做什么。不管它是什么,我敢打赌它将需要黑客;)

6

它与C#不兼容? Boolean.Parse和Boolean.TryParse不区分大小写,通过比较值为“True”和“False”的Boolean.TrueString或Boolean.FalseString来完成解析。

编辑:当在反射器的Boolean.ToString方法寻找事实证明,该字符串是硬编码,因此ToString方法如下:

public override string ToString() 
{ 
    if (!this) 
    { 
     return "False"; 
    } 
    return "True"; 
} 
+15

哇......这可能是C#中构造“if(!this)”有效的唯一上下文! – 2009-01-29 12:17:03

+2

那么为什么它不返回“假”是我问的 – 2009-01-29 12:18:05

16

很简单的代码,将其转换成小写。

但是,将“true”转换回“True”并非易事。

true.ToString().ToLower() 

是我用于xml输出。

96

...因为.NET环境旨在支持多种语言。

System.Boolean(in mscorlib.dll)被设计为在语言内部被用来支持布尔数据类型。 C#对其关键字使用全部小写字母,因此'bool','true'和'false'。

但是,VB.NET使用标准外壳:因此'布尔','真'和'假'。

由于语言必须一起工作,所以不能让True.ToString()(C#)给True.ToString()(VB.NET)提供不同的结果。 CLR设计人员为ToString()结果选择了标准的CLR套管表示法。

布尔值true的字符串表示形式定义为Boolean.TrueString。

(与System.String类似:C#将其呈现为'string'类型)。

-1

这可能是从旧的VB NOT .Net天,当bool.ToString产生True或False时。

5

我知道它为什么会被解决的原因,但是当谈到“自定义”布尔格式时,我有两种扩展方法,我不能再活下去了:-)

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); 
    } 
} 

用法很简单。以下各种布尔值转换为他们的葡萄牙人表示:

string verdadeiro = true.ToString("verdadeiro", "falso"); 
string falso = false.ToString("verdadeiro", "falso"); 
bool? v = null; 
string nulo = v.ToString("verdadeiro", "falso", "nulo"); 
0

原因true是“真”,是因为微软与XML标准的牢固关系。

Wikipedia来自: “可扩展标记语言(XML)是定义了一组用于在格式编码的文件的规则这既是人类可读和机器可读的标记语言”。

人类可读性是主观的,但在XML的眼中,使用单词“One”代替数字“1”是首选。您会注意到使用枚举时会发生这种情况,因为该单词被序列化而不是其值(“FirstOption”而不是“0”或“1”)。

同样,文本通常遵循CamelCasing。因此,XML不使用“字符串”,而更喜欢“字符串”。这就是为什么Boolean.TrueString为“True”,而Boolean.FalseString默认为“False”。