2009-01-29 89 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」。

相關問題