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

Output:
True
False

它是“真实”而不是“真实”有正当理由吗?在编写 XML 时它会中断,因为 XML 的 boolean 类型是小写,并且与 C# 的 true/false 不兼容(虽然不确定 CLS)。

更新

这是我在 C# 中绕过它的非常老套的方法(用于 XML)

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

当然,这会在堆栈中增加 1 个方法,但会在任何地方删除 ToLowers()。

4

9 回答 9

178

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

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

返回值

类型:System.String

如果此实例的值为 true,则为TrueString ;如果此实例的值为 false,则为 FalseString

评论

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

有趣的事实#1 出现了:它根本不返回 TrueString 或 FalseString。它使用硬编码的文字“True”和“False”。如果它使用这些字段对你没有任何好处,因为它们被标记为只读,所以没有改变它们。

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

评论

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

解决方案是什么?取决于你到底想做什么。不管是什么,我打赌它都需要破解 ;)

于 2009-01-29T12:23:36.837 回答
109

...因为 .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# 将其呈现为“字符串”类型)。

于 2009-01-29T12:14:49.227 回答
57

对于 Xml,您可以使用XmlConvert.ToString方法。

于 2009-01-29T12:13:45.750 回答
26

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

然而,将“真”转换回“真”并不是那么简单。

true.ToString().ToLower() 

是我用于 xml 输出的。

于 2009-01-29T12:11:05.270 回答
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";
}
于 2009-01-29T12:10:41.760 回答
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");
于 2013-10-28T12:19:58.953 回答
1

之所以true是“True”,是因为 Microsoft 与 XML 标准的紧密联系。

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

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

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

于 2014-11-10T23:33:21.120 回答
-1

这可能来自旧的 VB NOT .Net 时代,当时 bool.ToString 产生 True 或 False。

于 2009-01-29T12:25:24.947 回答
-1
    public bool CheckBool(string res)
    {
        if (res == null)
        {
            return false;
        }

        if (res.ToLower() == "true")
        {
            return true;
        }
        if (res.ToLower() == "false")
        {
            return false;
        }
        if (res == "0")
        {
            return false;
        }
        if (res == "1")
        {
            return true;
        }
        else
        {
            return bool.Parse(res);
        }
    }
于 2022-01-24T07:51:59.193 回答