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ブログでC#のブール型として "True"を逆シリアル化するための巧妙な回避策を読んだところです!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";。よりクリーンで、より効率的で、理論的にはロケールに依存する可能性があるメソッドにあまり依存していません(現在の実装ではそうではありませんが)。
Jon Hanna

1
これは、RestSharpを使用してオブジェクトのパブリックプロパティをQueryStringにシリアル化し、REST WebService呼び出しを行うときにも非常に煩わしいものです。REST APIがブールに対して大文字と小文字を区別する場合(GoogleのルートAPIなど)、これによりAPI呼び出しが失敗します。
Carlos P

8
「ToStringは.NET Frameworkの主要なフォーマットメソッドです。表示に適するように、オブジェクトを文字列表現に変換します。」(エンファシス鉱山)。Object.ToStringはシリアル化メカニズムではありません。:)
リトミス2014年

1
@aweええ、それは私が理論的なリスクから守ろうとするような経験です。それは現在起こっていません。
Jon Hanna 14年

回答:


165

マイクロソフトの人だけがその質問に本当に答えることができます。しかし、私はそれについていくつかの楽しい事実を提供したいと思います;)

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

戻り値

タイプ: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)メソッドは、プロバイダーパラメーターを持つほとんどのメソッドとは異なり、カルチャ固有の設定を反映しません。

解決策は何ですか?あなたが何をしようとしているかに依存します。それが何であれ、ハックが必要になると思います;)


2
間違っていても訂正してくださいBoolean.ToString()。の説明に問題はありません。bool.TrueStringハードコードされたリテラル「True」を含む読み取り専用フィールドです。したがって、文字列を返すと参照ではなく常に値が返されることを前提とすると、TrueString返されると言うことは、ハードコードされたリテラル「True」を返すと同じです。
フェルナンドネイラ

21
観測可能な結果は同じです。実装はそうではありません。
Vojislav Stojkovic

1
C#をコンパイルしても、コンパイル結果のBoolean.TrueStringは "True"に置き換えられません。それらが実際にBoolean.TrueStringを使用した場合、リフレクションを使用してBoolean.TrueStringを変更し、小文字のバージョンを返すことができます。ブール値のToStringメソッドをリフレクションを使用して置き換え、小文字のバリアントを返すこともできます。
Dewey Vozel 2014年

2
@FernandoNeira、明日ハードコードされたリテラルTrueStringが小文字の「true」に変更されたbool.ToString()場合でも、メソッドはパスカルケースの「True」リテラルを返します。
セルジュ

1
TrueとFalseをリテラル値として使用しているVisual Basicのせいです。
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#では 'string'タイプとして表示されます)。


4
彼らは物事のルックスからVBに対応しなければなりませんでした
Chris S

5
C#は「奇妙な」言語だと思います。.NETで公開されているものはすべてCamelCaseです-System.Boolean、True、System.Stringなど-文字列から文字列へのブール、ブールからブールへ、TrueからTrueへのエイリアス化につながるのはC#のC遺産です(私の個人的な好みはまだC#)。
stusmith、2009年

4
さらに、(私にとっては)小文字への変換は簡単ですが、特に@John Burnsが言ったようにVBが使用されている場合は、キャメルケースにするのは難しいです。それ以外の場合はVBのユーザーが使用することはありませんすることはできませんとToString()、彼らは次のように使用するように強制しましたIf(b, "True", "False")。したがって、私のようなc#ユーザーは、使用するために犠牲にする必要がありますToLower():)
CallMeLaNN

2
@MarkLopezコメントが正しくありません。msdn.microsoft.com/en-us/library/c8f5xwh7.aspxを参照してください。また、ブール定義を調べると、それが実際には構造体であることがわかり、2つは同じプロパティを持っています。
tsemer 14

1
あなたの答えはいくぶん光を放ちますが、「真」が「真」よりも「標準」である方法がわかりません。後者の方がはるかに人気があるようです。
わずか


25

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

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

true.ToString().ToLower() 

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


@stusmithの回答に加えて、多くの言語をサポートするために、これがMicrosoftがブールToString()結果のVBルックを好む理由です。
CallMeLaNN

@Damieh:実際、質問は「なぜ」です。これとは異なり、選択された答えは実際には可能な限りそれに近いものになります。
Nyerguds 2013

1
さらに良い; ToLowerInvariant()
バルカンレイヴン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、2009年

2
なぜそれは私が求めているものです「偽」を返すされていません
クリス・S

なんと変なことをするのか...状態を逆転させることを意味します。
nicodemus13

6
@TamasCzinege That's probably the only context in C# where the construct "if (!this)" is valid! あなたは私に挑戦しました、あなたは緩いです。gist.github.com/Steinblock/10df18afb948866be1ba-今日もジョージブールの200番目の
誕生

なぜこれが行われなかったのかしらreturn this ? "True" : "False";?(条件thisとしてはあまり見られない別の珍しいケースです?:が、ここではそれは理にかなっています。)
ダレルホフマン

7

私はそれがすでに対処されている方法である理由を知っていますが、それが「カスタム」のブール形式になると、私はこれなしでは生きられない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");

「拡張メソッドを使用してクラスまたはインターフェースを拡張することはできますが、それらをオーバーライドすることはできません。インターフェースまたはクラスメソッドと同じ名前とシグネチャを持つ拡張メソッドは呼び出されません。コンパイル時、拡張メソッドは常にタイプ自体で定義されたインスタンスメソッド。」あなたのソリューションは機能しますか?(たぶんToString()は継承されているのでオーバーライドできますか?)
jwize

1
私の以前のコメントには、この署名は何も上書きしていないと思います。
jwize

@jwizeはい、これらは新しいシグネチャなので、オーバーライドではなくオーバーロードです;-)
Loudenvier

0

理由 trueは、「真」は、MicrosoftとXML標準との強い結びつきによるものです。

ウィキペディアから:「Extensible Markup Language(XML)は、人間が読める形式でドキュメントをエンコードするための一連のルールを定義するマークアップ言語です。と機械が読める。」

人間が読める形式は主観的ですが、XMLの観点からは、数値「1」の代わりに「One」という単語を使用することをお勧めします。単語がその値の代わりにシリアル化されるため( "0"または "1"の代わりに "FirstOption")、列挙型を使用してこれが発生することに気づくでしょう。

同様に、テキストは通常CamelCasingに従います。したがって、XMLは「文字列」ではなく「文字列」を優先します。これが、Boolean.TrueStringがデフォルトで「True」であり、Boolean.FalseStringが「False」である理由です。


7
「真」ではなく「真」に設定すると、XMLブール値が壊れるのはおかしいですか。-「XMLでは大文字と小文字が区別され、XML仕様では "true"と "false"がブール値の有効なセットとして認識されることに注意してください」
PandaWood

-1

これはおそらく、bool.ToStringがTrueまたはFalseを生成した古いVB NOT .Netの時代を思わせるものです。


3
.NET以前は、VBのブールデータ型(実際にはすべてのデータ型)にはメソッドがありませんでした。
Sam Ax

1
VB6では、ブール型を文字列に変換することもできました(文字列変数に割り当てる最も簡単な方法)。これについて奇妙なのは、変換が実際には文化固有であるため、実行中のコンピューターの文化言語がノルウェー語の場合、結果は「True」と「False」ではなく「Sann」と「Usann」でした。これは、ブール設定がテキストファイルに保存され、コンピューターが英語(US)カルチャでセットアップされた別の環境にエクスポートされた場合に、しばしば問題を引き起こしました。
畏敬の念
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.