Pourquoi Boolean.ToString affiche-t-il "True" et non "true"

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

Output:
True
False

Y a-t-il une raison valable pour qu'elle soit "vraie" et non "vraie"? Il casse lors de l'écriture de XML car le type booléen de XML est en minuscules et n'est également pas compatible avec le vrai / faux de C # (cependant pas sûr de CLS).

Mettre à jour

Voici ma façon très hacky de le contourner en C # (pour une utilisation avec XML)

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

Bien sûr, cela ajoute 1 méthode de plus à la pile, mais supprime ToLowers () partout.

Chris S
la source
1
Je pensais juste mentionner cela ... Je viens de lire une solution de contournement astucieuse pour désérialiser "True" comme type booléen en C # sur un blog msdn! voir http://blogs.msdn.com/helloworld/archive/2009/04/03/workaround-to-deserialize-true-false-using-xmlserializer.aspx
Peter
23
Je remplacerais return b.ToString().ToLower();par return b ? "true" : "false";. Plus propre, plus efficace, moins dépendant d'une méthode qui pourrait théoriquement dépendre des paramètres régionaux (même si ce n'est pas le cas dans les implémentations actuelles).
Jon Hanna
1
Cela est également assez ennuyeux lors de l'utilisation de RestSharp pour sérialiser les propriétés publiques d'un objet dans une requête QueryString pour effectuer un appel WebService REST. Si l'API REST est sensible à la casse pour les bools (par exemple l'API Google Directions), cela entraîne l'échec de l'appel de l'API.
Carlos P
8
"ToString est la principale méthode de mise en forme dans le .NET Framework. Il convertit un objet en sa représentation sous forme de chaîne afin qu'il puisse être affiché ." (Je souligne). Object.ToString n'est pas un mécanisme de sérialisation . :)
Rytmis
1
@awe ouais, c'est le genre d'expérience qui m'amène à me prémunir contre le risque théorique même s'il ne se produit pas actuellement.
Jon Hanna

Réponses:

165

Seuls les gens de Microsoft peuvent vraiment répondre à cette question. Cependant, je voudrais offrir quelques faits amusants à ce sujet;)

Tout d'abord, voici ce qu'elle dit dans MSDN à propos de la méthode Boolean.ToString () :

Valeur de retour

Type: System.String

TrueString si la valeur de cette instance est vraie, ou FalseString si la valeur de cette instance est fausse.

Remarques

Cette méthode renvoie les constantes "True" ou "False". Notez que XML est sensible à la casse et que la spécification XML reconnaît "vrai" et "faux" comme l'ensemble valide de valeurs booléennes. Si l'objet String renvoyé par la méthode ToString () doit être écrit dans un fichier XML, sa méthode String.ToLower doit être appelée en premier pour le convertir en minuscules.

Voici le fait amusant n ° 1: il ne retourne pas du tout TrueString ou FalseString. Il utilise des littéraux codés en dur "True" et "False". Cela ne vous servirait à rien s'il utilisait les champs, car ils sont marqués comme étant en lecture seule, il n'y a donc pas de changement.

La méthode alternative, Boolean.ToString (IFormatProvider) est encore plus drôle:

Remarques

Le paramètre fournisseur est réservé. Il ne participe pas à l'exécution de cette méthode. Cela signifie que la méthode Boolean.ToString (IFormatProvider), contrairement à la plupart des méthodes avec un paramètre de fournisseur, ne reflète pas les paramètres spécifiques à la culture.

Quelle est la solution? Cela dépend exactement de ce que vous essayez de faire. Quoi qu'il en soit, je parie qu'il faudra un hack;)

Vojislav Stojkovic
la source
2
Corrigez-moi si je me trompe, mais je ne vois rien de mal à l'explication Boolean.ToString(). bool.TrueStringest un champ en lecture seule qui contient le littéral codé en dur "True" . Par conséquent, dire qu'il renvoie revient TrueStringà dire qu'il renvoie le littéral codé en dur "True" qui y est stocké, étant donné que le retour d'une chaîne renvoie toujours la valeur et non une référence.
Fernando Neira
21
Le résultat observable est le même. L'implémentation ne l'est pas.
Vojislav Stojkovic
1
Compiler le C # ne remplacerait pas le Boolean.TrueString par "True" dans les résultats compilés. S'ils ont effectivement utilisé Boolean.TrueString, vous pouvez utiliser la réflexion pour modifier Boolean.TrueString pour renvoyer une version en minuscules ... bien sûr, qui sait ce que cela casserait. Vous pouvez toujours utiliser la réflexion pour remplacer la méthode ToString sur Boolean afin qu'elle renvoie les variantes minuscules.
Dewey Vozel
2
@FernandoNeira, si demain le littéral codé en dur TrueStringest changé, disons, en "vrai" en minuscules, la méthode bool.ToString()renverra toujours le littéral pascal "vrai".
Serge
1
Je blâme Visual Basic, qui utilise True et False comme valeurs littérales.
mrcrowl
105

... car l'environnement .NET est conçu pour prendre en charge de nombreuses langues.

System.Boolean (dans mscorlib.dll) est conçu pour être utilisé en interne par les langues pour prendre en charge un type de données booléen. C # utilise tous les minuscules pour ses mots clés, d'où «bool», «true» et «false».

VB.NET utilise cependant une casse standard: d'où «booléen», «vrai» et «faux».

Étant donné que les langages doivent fonctionner ensemble, vous ne pouvez pas avoir true.ToString () (C #) donnant un résultat différent de True.ToString () (VB.NET). Les concepteurs CLR ont choisi la notation de casse CLR standard pour le résultat ToString ().

La représentation sous forme de chaîne du booléen true est définie comme étant Boolean.TrueString.

(Il y a un cas similaire avec System.String: C # le présente comme le type 'string').

stusmith
la source
4
Ils devaient s'adapter à VB à première vue
Chris S
5
Je dirais que C # est le langage "étrange". Tout ce qui est public dans .NET est CamelCase - System.Boolean, True, System.String, etc. toujours C #).
stusmith
4
De plus, la bonne raison (pour moi) est de convertir en minuscules est facile alors qu'il est difficile de le faire CamelCase en particulier lorsque VB est utilisé comme l'a dit @John Burns. Sinon, l'utilisateur VB ne peut pas et n'utilisera jamais le ToString()et il a été obligé d'utiliser comme If(b, "True", "False"). Donc, l'utilisateur c # comme moi doit sacrifier pour utiliser ToLower():)
CallMeLaNN
2
@MarkLopez Votre commentaire est incorrect, voir ici: msdn.microsoft.com/en-us/library/c8f5xwh7.aspx . De plus, la recherche de la définition booléenne révèle qu'il s'agit en fait d'une structure et que les deux ont les mêmes propriétés.
tsemer
1
Bien que votre réponse éclaire un peu, je ne comprends pas comment «vrai» est plus «standard» que «vrai». Il semble que ce dernier soit beaucoup plus populaire.
léger
50

Pour Xml, vous pouvez utiliser la méthode XmlConvert.ToString .

bruno conde
la source
4
Cela semble de loin la méthode la plus élégante. Aucune programmation supplémentaire et utilisation d'une bibliothèque officielle réellement créée dans le but de la sortie xml.
Nyerguds
25

C'est un code simple pour convertir cela en minuscules.

Cependant, il n'est pas si simple de reconvertir "vrai" en "vrai".

true.ToString().ToLower() 

est ce que j'utilise pour la sortie xml.

John
la source
En plus de la réponse @stusmith, car pour prendre en charge de nombreuses langues, c'est une bonne raison pour laquelle Microsoft préfère l'aspect VB du ToString()résultat booléen .
CallMeLaNN
@Damieh: en fait, la question est "Pourquoi". Contrairement à cela, la réponse sélectionnée se rapproche le plus possible de la réponse.
Nyerguds
1
Mieux encore; ToLowerInvariant().
vulcan raven
3
Vous pouvez utiliser System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToTitleCase pour reconvertir "true" en "True".
Jenny O'Reilly
8

Comment n'est-il pas compatible avec C #? Boolean.Parse et Boolean.TryParse est insensible à la casse et l'analyse est effectuée en comparant la valeur à Boolean.TrueString ou Boolean.FalseString qui sont "True" et "False".

EDIT: Lorsque vous regardez la méthode Boolean.ToString dans le réflecteur, il s'avère que les chaînes sont codées en dur, la méthode ToString est donc la suivante:

public override string ToString()
{
    if (!this)
    {
        return "False";
    }
    return "True";
}
Rune Grimstad
la source
23
Wow ... C'est probablement le seul contexte en C # où la construction "if (! This)" est valide!
Tamas Czinege
2
alors pourquoi ne revient-il pas "faux", c'est ce que je demande
Chris S
Quelle chose bizarre à faire ... Je veux dire inverser la condition.
nicodemus13
6
@TamasCzinege That's probably the only context in C# where the construct "if (!this)" is valid! Vous m'avez défié, vous perdez . gist.github.com/Steinblock/10df18afb948866be1ba - C'est également aujourd'hui le 200e anniversaire de George Boole
Jürgen Steinblock
Vous vous demandez pourquoi cela n'a pas été fait return this ? "True" : "False";? (Un autre cas inhabituel car vous ne voyez pas souvent thiscomme une ?:condition, mais ici, cela aurait du sens.)
Darrel Hoffman
7

Je sais que la raison pour laquelle c'est ainsi a déjà été abordée, mais en ce qui concerne le formatage booléen "personnalisé", j'ai deux méthodes d'extension dont je ne peux plus me passer :-)

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

L'utilisation est triviale. Les éléments suivants convertissent diverses valeurs booléennes en leurs représentations portugaises:

string verdadeiro = true.ToString("verdadeiro", "falso");
string falso = false.ToString("verdadeiro", "falso");
bool? v = null;
string nulo = v.ToString("verdadeiro", "falso", "nulo");
Loudenvier
la source
"Vous pouvez utiliser des méthodes d'extension pour étendre une classe ou une interface, mais pas pour les remplacer. Une méthode d'extension ayant le même nom et la même signature qu'une interface ou une méthode de classe ne sera jamais appelée. Au moment de la compilation, les méthodes d'extension ont toujours une priorité inférieure à méthodes d'instance définies dans le type lui-même. " Votre solution fonctionne-t-elle? (Peut-être que ToString () est hérité et peut donc être
annulé
1
Je suppose que pour mon commentaire précédent, cette signature ne remplace rien.
jwize
@jwize oui, ce sont de nouvelles signatures, c'est donc une surcharge et non une dérogation ;-)
Loudenvier
0

La raison true est "True" en raison du lien fort de Microsoft avec les normes XML.

Extrait de Wikipédia : "Extensible Markup Language (XML) est un langage de balisage qui définit un ensemble de règles pour coder les documents dans un format qui est à la fois lisible par l'homme et machine."

Lisible par l'homme est subjectif, mais aux yeux de XML, il est préférable d'utiliser le mot "Un" à la place du chiffre "1". Vous remarquerez que cela se produit en utilisant des énumérations, car le mot est sérialisé au lieu de sa valeur ("FirstOption" au lieu de "0" ou "1").

De même, le texte suit généralement CamelCasing . Par conséquent, au lieu de "chaîne", XML préfère "chaîne". C'est pourquoi Boolean.TrueString est "True" et Boolean.FalseString est "False" par défaut.

Kody
la source
7
C'est drôle que le booléen XML se brise si vous le définissez sur "True" et non "true" alors? - "Notez que XML est sensible à la casse et que la spécification XML reconnaît" vrai "et" faux "comme l'ensemble valide de valeurs booléennes"
PandaWood
-1

Cela est probablement lié aux anciens jours VB NOT .Net où bool.ToString produisait True ou False.

cjk
la source
3
Avant .NET, le type de données booléen dans VB (en fait, tous les types de données) n'avait pas de méthodes.
Sam Axe
1
Dans VB6, vous pouvez toujours convertir le type booléen en chaîne (le moyen le plus simple de l'affecter à une variable chaîne). La chose étrange à ce sujet, c'est que la conversion était en fait spécifique à la culture, donc si votre langue de culture sur l'ordinateur en cours était norvégienne, le résultat était "Sann" et "Usann" au lieu de "True" et "False"! Cela provoquait souvent des problèmes si les paramètres booléens étaient stockés dans un fichier texte et exportés vers un autre environnement où l'ordinateur était configuré avec la culture anglaise (US).
awe