web-dev-qa-db-fra.com

Pourquoi Boolean.ToString génère-t-il "True" et non "true"?

true.ToString() 
false.toString();

Output:
True
False

Y a-t-il une raison valable pour que ce soit "vrai" et non "vrai"? Il se brise lors de l'écriture de XML car le type booléen de XML est en minuscule et n'est pas non plus compatible avec les symboles true/false de C # (pas sûr de CLS).

Mise à jour

Voici ma façon très compliquée 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 une méthode supplémentaire à la pile, mais supprime ToLowers () partout.

218
Chris S

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

Premièrement, voici ce qui est écrit dans MSDN à propos de la méthode Boolean.ToString ():

valeur de retour

Type: System.String

TrueString si la valeur de cette instance est true, ou FalseString si le la valeur de cette instance est false.

Remarques

Cette méthode retourne les constantes "True" ou "False". Notez que XML est sensible à la casse et que la spécification XML reconnaît "true" et "false" en tant qu'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 d'abord être appelée pour le convertir en minuscule.

Voici le fait amusant # 1: il ne renvoie pas du tout TrueString ou FalseString. Il utilise des littéraux codés en dur "True" et "False". Cela ne vous servirait à rien d'utiliser les champs, car ils sont marqués comme étant en lecture seule, ils ne peuvent donc pas être modifiés.

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

Remarques

Le paramètre provider 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 de ce que vous essayez exactement de faire. Quoi qu'il en soit, je parie que cela nécessitera un bidouillage;)

154
Vojislav Stojkovic

... parce que 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 afin de prendre en charge un type de données boolean. C # utilise toutes les minuscules pour ses mots clés, d'où les mots "bool", "true" et "false".

VB.NET utilise toutefois des boîtiers standard: d’où "Boolean", "True" et "False".

Etant donné que les langues doivent fonctionner ensemble, vous ne pouviez pas avoir true.ToString () (C #) donnant un résultat différent de True.ToString () (VB.NET). Les concepteurs CLR ont choisi la notation de boîtier CLR standard pour le résultat ToString ().

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

(Il y a un cas similaire avec System.String: C # le présente comme type "chaîne").

102
stusmith

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

47
bruno conde

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

Pas si simple de convertir "vrai" de nouveau en "vrai", cependant.

true.ToString().ToLower() 

c'est ce que j'utilise pour la sortie XML.

21
John

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

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

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

Je connais la raison pour laquelle c'est comme ça que ça a déjà été abordé, mais quand il s'agit de formatage booléen "personnalisé", j'ai deux méthodes d'extension sans lesquelles je ne peux plus vivre :-)

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

La raison pour laquelle true est "True" est due au lien étroit que Microsoft entretient avec les normes XML.

De Wikipedia : "Le langage de balisage extensible (XML) est un langage de balisage qui définit un ensemble de règles permettant de coder des documents dans un format à la fois lisible et lisible par machine. "

La lecture humaine est subjective, mais aux yeux de XML, il est préférable d’utiliser le mot "One" à la place du nombre "1". Vous remarquerez que cela se produit à l'aide d'énums, car Word 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.

0
Kody