web-dev-qa-db-ja.com

Boolean.ToStringが「true」ではなく「True」を出力する理由

true.ToString() 
false.toString();

Output:
True
False

「真」ではなく「真」であることの正当な理由はありますか? XMLのブール型は小文字であり、C#のtrue/falseと互換性がないため(CLSについてはわかりません)、XMLを記述すると中断します。

更新

C#でそれを回避するための私の非常にハックな方法は次のとおりです(XMLで使用するため)

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

もちろん、スタックにもう1つのメソッドが追加されますが、ToLowers()はどこでも削除されます。

218
Chris S

Microsoftの人だけが本当にその質問に答えることができます。しかし、私はそれについていくつかの面白い事実を提供したいと思います;)

まず、これはBoolean.ToString()メソッドについてMSDNで言われていることです。

戻り値

タイプ:System.String

TrueStringこのインスタンスの値がtrueの場合、またはFalseStringの場合このインスタンスの値はfalseです。

備考

このメソッドは、定数「True」または「False」を返します。 XMLでは大文字と小文字が区別され、XML仕様ではブール値の有効なセットとして「true」と「false」が認識されることに注意してください。 ToString()メソッドによって返されたStringオブジェクトをXMLファイルに書き込む場合、そのString.ToLowerメソッドを最初に呼び出して小文字に変換する必要があります。

ここからが面白い事実です。1:TrueStringまたはFalseStringをまったく返しません。ハードコードされたリテラル「True」および「False」を使用します。フィールドが読み取り専用としてマークされているため、フィールドを使用している場合は何の役にも立たないので、変更はありません。

代替メソッドBoolean.ToString(IFormatProvider)はさらに面白い:

備考

プロバイダーパラメーターは予約されています。このメソッドの実行には関与しません。これは、プロバイダーパラメーターを持つほとんどのメソッドとは異なり、Boolean.ToString(IFormatProvider)メソッドがカルチャ固有の設定を反映しないことを意味します。

解決策は何ですか?まさにあなたがやろうとしていることに依存します。それが何であれ、ハックが必要になると確信しています;)

154

.... 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#はそれを 'string'タイプとして提示します)。

102
stusmith

Xmlの場合、 XmlConvert.ToString メソッドを使用できます。

47
bruno conde

それをすべて小文字に変換する簡単なコードです。

ただし、「true」を「true」に戻すのはそれほど簡単ではありません。

true.ToString().ToLower() 

xml出力に使用するものです。

21
John

C#と互換性がないのはどうしてですか? Boolean.ParseとBoolean.TryParseは大文字と小文字を区別せず、値を「True」と「False」であるBoolean.TrueStringまたはBoolean.FalseStringと比較することで解析が行われます。

編集:リフレクターのBoolean.ToStringメソッドを見ると、ToStringメソッドは次のように文字列がハードコードされていることがわかります:

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

私はそれがすでに対処されている方法である理由を知っていますが、「カスタム」ブールフォーマットに関しては、これなしでは生きていけない2つの拡張メソッドがあります:-)

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

trueが「True」である理由は、MicrosoftがXML標準と強く結び付いているためです。

From Wikipedia :「Extensible Markup Language(XML)は、両方human-readableおよび機械可読。」

人間が読み取れるのは主観的ですが、XMLの観点では、数字の「1」の代わりに「1」という単語を使用することが推奨されます。これは、値の代わりにWordがシリアル化されるため(enumsを使用して発生することに注意してください(「0」または「1」ではなく「FirstOption」)。

同様に、テキストは一般的に CamelCasing の後に続きます。したがって、XMLは「文字列」ではなく「文字列」を好みます。これが、Boolean.TrueStringがデフォルトで「True」で、Boolean.FalseStringが「False」である理由です。

0
Kody