Pourquoi Boolean.ToSsortingng affiche-t-il «True» et non «true»

true.ToSsortingng() false.toSsortingng(); Output: True False 

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

Mettre à jour

Voici ma façon de le contourner en C # (à utiliser avec XML)

 internal static ssortingng ToXmlSsortingng(this bool b) { return b.ToSsortingng().ToLower(); } 

Bien sûr, cela ajoute une méthode supplémentaire à la stack, mais supprime ToLowers () partout.

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

Tout d’abord, voici ce qu’il dit dans MSDN à propos de la méthode Boolean.ToSsortingng () :

Valeur de retour

Type: System.Ssortingng

TrueSsortingng si la valeur de cette instance est true ou FalseSsortingng si la valeur de cette instance est false.

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 “true” et “false” comme ensemble valide de valeurs booléennes. Si l’object Ssortingng renvoyé par la méthode ToSsortingng () doit être écrit dans un fichier XML, sa méthode Ssortingng.ToLower doit être appelée en premier pour la convertir en minuscule.

Voici le fait amusant n ° 1: il ne renvoie pas TrueSsortingng ou FalseSsortingng du tout. 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, donc il n’y a pas de changement.

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

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.ToSsortingng (IFormatProvider), contrairement à la plupart des méthodes avec un paramètre fournisseur, ne reflète pas les parameters spécifiques à la culture.

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

… parce que l’environnement .NET est conçu pour prendre en charge plusieurs langues.

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

VB.NET utilise cependant un casse standard: donc “Booléen”, “Vrai” et “Faux”.

Comme les langages doivent fonctionner ensemble, true.ToSsortingng () (C #) ne peut pas donner un résultat différent à True.ToSsortingng () (VB.NET). Les concepteurs de CLR ont choisi la notation de casse CLR standard pour le résultat ToSsortingng ().

La représentation sous forme de chaîne de la valeur booléenne true est définie sur Boolean.TrueSsortingng.

(Il y a un cas similaire avec System.Ssortingng: C # le présente comme le type ‘ssortingng’).

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

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

Pas si simple de convertir “true” en “True”, cependant.

 true.ToSsortingng().ToLower() 

est ce que j’utilise pour la sortie xml.

Comment est-ce que ce n’est pas compatible avec C #? Boolean.Parse et Boolean.TryParse sont insensibles à la casse et l’parsing se fait en comparant la valeur à Boolean.TrueSsortingng ou Boolean.FalseSsortingng qui sont “True” et “False”.

EDIT: En regardant la méthode Boolean.ToSsortingng dans le réflecteur, il s’avère que les chaînes sont codées en dur, la méthode ToSsortingng est la suivante:

 public override ssortingng ToSsortingng() { if (!this) { return "False"; } return "True"; } 

Je sais que la raison pour laquelle c’est comme ça, a déjà été abordée, mais en ce qui concerne le format booléen “personnalisé”, j’ai deux méthodes d’extension dont je ne peux plus me passer 🙂

 public static class BoolExtensions { public static ssortingng ToSsortingng(this bool? v, ssortingng trueSsortingng, ssortingng falseSsortingng, ssortingng nullSsortingng="Undefined") { return v == null ? nullSsortingng : v.Value ? trueSsortingng : falseSsortingng; } public static ssortingng ToSsortingng(this bool v, ssortingng trueSsortingng, ssortingng falseSsortingng) { return ToSsortingng(v, trueSsortingng, falseSsortingng, null); } } 

L’utilisation est sortingviale. Ce qui suit convertit diverses valeurs bool dans leurs représentations portugaises:

 ssortingng verdadeiro = true.ToSsortingng("verdadeiro", "falso"); ssortingng falso = false.ToSsortingng("verdadeiro", "falso"); bool? v = null; ssortingng nulo = v.ToSsortingng("verdadeiro", "falso", "nulo"); 

La raison en est que “True” est due au lien fort de Microsoft avec les normes XML.

From Wikipedia : “XML (Extensible Markup Language) est un langage de balisage qui définit un ensemble de règles pour le codage de documents dans un format à la fois lisible par l’homme et lisible par une machine.”

Lisible par l’homme est subjective, mais aux yeux du XML, l’utilisation du mot “un” à la place d’un nombre “1” est préférable. 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.TrueSsortingng est “True” et Boolean.FalseSsortingng est “False” par défaut.

Cela provient probablement des anciens jours VB NOT .Net où bool.ToSsortingng produisait True ou False.