为什么Boolean.ToString输出“ True”而不是“ true”


235
true.ToString() 
false.toString();

Output:
True
False

是否有正当理由是“真实”而不是“真实”?当编写XML时,它会中断,因为XML的布尔类型是小写,并且也不兼容C#的true / false(尽管不确定CLS)。

更新资料

这是我在C#中解决问题的一种非常骇人的方法(用于XML)

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

当然,这会在堆栈中增加1种方法,但是会在各处删除ToLowers()。


1
只是以为我会提到这一点...我刚刚读了一些聪明的解决方法,可以在msdn博客上将“ True”反序列化为C#中的布尔类型!参见http://blogs.msdn.com/helloworld/archive/2009/04/03/workaround-to-deserialize-true-false-using-xmlserializer.aspx
Peter

23
我将替换return b.ToString().ToLower();return b ? "true" : "false";。更干净,更高效,更少依赖于一种理论上可以依赖于语言环境的方法(即使当前实现中不存在这种方法)。
乔恩·汉娜

1
使用RestSharp将对象的公共属性序列化为QueryString进行REST WebService调用时,这也很烦人。如果REST API区分大小写(例如Google Directions API),则这会导致API调用失败。
卡洛斯·P

8
“ ToString是.NET Framework中的主要格式化方法。它将对象转换为其字符串表示形式,从而使其适合显示。” (强调我的)。Object.ToString不是序列化机制。:)
Rytmis 2014年

1
@awe是的,那是一种经验,即使没有实际发生,也使我警惕理论风险。
乔恩·汉纳

Answers:


165

只有Microsoft的人员才能真正回答这个问题。但是,我想提供一些有趣的事实;)

首先,这就是MSDN中关于Boolean.ToString()方法的内容:

返回值

类型:System.String

TrueString如果此实例的值是true,或者FalseString如果此实例的值是假的。

备注

此方法返回常量“ True”或“ False”。请注意,XML区分大小写,并且XML规范将“ true”和“ false”识别为有效的布尔值集。如果要将ToString()方法返回的String对象写入XML文件,则应首先调用其String.ToLower方法以将其转换为小写。

有趣的事实#1来了:它根本不返回TrueString或FalseString。它使用硬编码的文字“ True”和“ False”。如果使用这些字段,将不会对您有任何好处,因为它们被标记为只读,因此无法进行更改。

替代方法Boolean.ToString(IFormatProvider)甚至更有趣:

备注

提供者参数是保留的。它不参与此方法的执行。这意味着,与大多数带有提供程序参数的方法不同,Boolean.ToString(IFormatProvider)方法不会反映特定于区域性的设置。

有什么解决办法?取决于您到底要做什么。不管是什么,我敢打赌这将需要破解;)


2
如果我错了,请纠正我,但我对的解释没有发现任何问题Boolean.ToString()bool.TrueString是一个只读字段,其中包含硬编码字面量“ True”。因此,假定返回字符串始终返回值而不是引用,那么说返回TrueString就等于返回存储在其中的硬编码文字“ True”
Fernando Neira 2012年

21
可观察的结果是相同的。实现不是。
Vojislav Stojkovic

1
编译C#不会在编译结果中将Boolean.TrueString替换为“ True”。如果他们实际上使用了Boolean.TrueString,那么您可以使用反射来更改Boolean.TrueString以返回小写版本...当然,谁知道会破坏什么。您仍然可以使用反射来替换Boolean上的ToString方法,以便它返回小写字母的变体。
杜威·沃泽尔2014年

2
@FernandoNeira,如果明天将硬编码字面TrueString量更改为小写的“ true”,则该方法bool.ToString()仍将返回pascal大小写“ True”字面量。
Serge

1
我归咎于Visual Basic,它使用True和False作为其文字值。
mrcrowl

105

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

System.Boolean(在mscorlib.dll中)旨在由语言在内部使用,以支持布尔数据类型。C#将所有小写字母用作其关键字,因此为'bool','true'和'false'。

但是,VB.NET使用标准大小写:因此为“布尔”,“真”和“假”。

由于这些语言必须协同工作,因此不可能有true.ToString()(C#)为True.ToString()(VB.NET)提供不同的结果。CLR设计人员为ToString()结果选择了标准CLR大小写表示法。

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

(System.String也有类似情况:C#将其表示为“字符串”类型)。


4
他们必须从外观上适应VB
Chris S

5
我会说C#是“奇数”语言。.NET中所有公开的内容都是CamelCase-System.Boolean,True,System.String等-C#的C传统导致String别名为String,Boolean布尔为bool,True为true等。(尽管我个人的喜好是仍然是C#)。
stusmith

4
另外,(对我而言)将小写转换为小写是很容易的,而很难将其转换为CamelCase,尤其是当像@John Burns所说的那样使用VB时。否则,VB用户不能并且永远不会使用,ToString()而他们不得不使用like If(b, "True", "False")。所以像我这样的c#用户需要牺牲使用才能使用ToLower():)
CallMeLaNN 2011年

2
@MarkLopez您的评论不正确,请参见此处:msdn.microsoft.com/en-us/library/c8f5xwh7.aspx。另外,查找布尔定义会发现它实际上是一个结构,并且两者确实具有相同的属性。
tsemer

1
尽管您的答案有些含糊,但我不明白“真实”比“真实”更“标准”。后者似乎更受欢迎。
2015年


25

这是将其转换为所有小写字母的简单代码。

但是,将“ true”转换回“ True”并不是那么简单。

true.ToString().ToLower() 

这是我用于xml输出的内容。


除了@stusmith答案,因为它支持多种语言之外,这也是Microsoft偏爱布尔ToString()结果的VB外观的很好原因。
CallMeLaNN 2011年

@Damieh:实际上,问题是“为什么”。与此不同的是,所选答案实际上尽可能接近答案。
Nyerguds 2013年

1
更好 ToLowerInvariant()
vulcan raven 2014年

3
您可以使用System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToTitleCase将“ true”转换回“ True”。
珍妮·奥雷利

8

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

编辑:当在反射器中查看Boolean.ToString方法时,结果表明字符串是硬编码的,因此ToString方法如下:

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

23
哇...这可能是C#中唯一有效的“ if(!this)”构造上下文!
Tamas Czinege,09年

2
所以我要问的是为什么它不返回“ false”
Chris S

要做一件奇怪的事...我的意思是颠倒条件。
nicodemus13年

6
@TamasCzinege That's probably the only context in C# where the construct "if (!this)" is valid! 你挑战了我,你松了。gist.github.com/Steinblock/10df18afb948866be1ba-今天也是乔治·布尔(George Boole)诞辰200
周年

想知道为什么不这样做return this ? "True" : "False";吗?(另一种不常见的情况,因为您通常不认为这this是一种?:情况,但在这里很有意义。)
Darrel Hoffman

7

我知道它已被解决的原因,但是当涉及到“自定义”布尔格式时,我有两个扩展方法,我不能再没有了:-)

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

“您可以使用扩展方法来扩展类或接口,但不能覆盖它们。永远不会调用与接口或类方法具有相同名称和签名的扩展方法。在编译时,扩展方法的优先级始终低于类型本身定义的实例方法。” 您的解决方案有效吗?(也许ToString()是继承的,因此可以被覆盖吗?)
jwize 2015年

1
我想对我以前的评论来说,这个签名没有覆盖任何东西。
jwize

@jwize是的,这些是新的签名,所以它是重载而不是替代;-)
Loudenvier

0

原因true是“ True”是因为Microsoft与XML标准的牢固联系。

摘自Wikipedia:“可扩展标记语言(XML)是一种标记语言,它定义了一组用于以人类可读和机器可读的格式编码文档的规则。”

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

同样,文本通常在CamelCasing之后。因此,XML更喜欢“ String”而不是“ string”。这就是默认情况下Boolean.TrueString为“ True”而Boolean.FalseString为“ False”的原因。


7
有趣的是,如果将XML布尔值设置为“ True”而不是“ true”,则布尔值会破坏吗?-“请注意,XML区分大小写,并且XML规范将“ true”和“ false”识别为有效的布尔值集”
PandaWood 2014年

-1

这可能是从bool.ToString产生True或False的旧VB NOT .Net时代过去的。


3
在.NET之前,VB中的布尔数据类型(实际上,所有数据类型)都没有方法。
山姆·艾克斯

1
在VB6中,您仍然可以将布尔类型转换为字符串(将其分配给String变量的最简单方法)。奇怪的是,转换实际上是特定于文化的,因此,如果您在运行的计算机上使用的文化语言是挪威语,则结果是“ Sann”和“ Usann”,而不是“ True”和“ False”!如果将布尔设置存储在文本文件中,然后将其导出到使用英语(美国)文化设置计算机的其他环境中,则通常会引起问题。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.