Почему Boolean.ToString выводит «True», а не «true» - PullRequest
214 голосов
/ 29 января 2009
true.ToString() 
false.toString();

Output:
True
False

Есть ли веская причина для того, чтобы это было "Истина", а не "Истина"? Он ломается при записи XML, так как логический тип XML в нижнем регистре , а также не совместим с true / false C # (хотя не уверен насчет CLS).

Обновление

Вот мой очень хакерский способ обойти это в C # (для использования с XML)

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

Конечно, это добавляет еще 1 метод в стек, но удаляет ToLowers () везде.

Ответы [ 8 ]

152 голосов
/ 29 января 2009

Только люди из Microsoft могут действительно ответить на этот вопрос. Тем не менее, я хотел бы предложить некоторые забавные факты об этом;)

Во-первых, в MSDN говорится о методе Boolean.ToString () :

Возвращаемое значение

Тип: System.String

TrueString если значение этого экземпляр равен true или FalseString , если значение этого экземпляра ложно.

Примечания

Этот метод возвращает константы "True" или "False". Обратите внимание, что XML чувствителен к регистру, и что Спецификация XML распознает «истинно» и «ложь» в качестве действительного набора Булевы значения. Если объект String возвращается методом ToString () должен быть записан в файл XML, его Метод String.ToLower должен быть сначала позвонил, чтобы преобразовать его в в нижнем регистре.

Вот забавный факт # 1: он вообще не возвращает TrueString или FalseString. Он использует жестко закодированные литералы «True» и «False». Не помогло бы, если бы использовались поля, потому что они помечены как доступные только для чтения, поэтому их не нужно менять.

Альтернативный метод, Boolean.ToString (IFormatProvider) еще смешнее:

Примечания

Параметр провайдера зарезервирован. Он не участвует в выполнении этого метода. Это означает, что метод Boolean.ToString (IFormatProvider), в отличие от большинства методов с параметром провайдера, не отражает специфичные для культуры параметры.

Какое решение? Зависит от того, что именно вы пытаетесь сделать. Что бы это ни было, держу пари, это потребует взлома;)

102 голосов
/ 29 января 2009

... потому что среда .NET разработана для поддержки многих языков.

System.Boolean (в mscorlib.dll) предназначен для внутреннего использования языками для поддержки логического типа данных. C # использует все строчные буквы для своих ключевых слов, следовательно, «bool», «true» и «false».

VB.NET, однако, использует стандартный регистр: отсюда 'Boolean', 'True' и 'False'.

Поскольку языки должны работать вместе, у вас не может быть true.ToString () (C #), дающего другой результат для True.ToString () (VB.NET). Разработчики CLR выбрали стандартную запись CLR для результата ToString ().

Строковое представление логического true определено как Boolean.TrueString.

(аналогичный случай с System.String: C # представляет его как тип 'string').

43 голосов
/ 29 января 2009

Для XML вы можете использовать метод XmlConvert.ToString .

20 голосов
/ 29 января 2009

Это простой код для преобразования в нижний регистр.

Однако не так просто преобразовать «true» в «True».

true.ToString().ToLower() 

- это то, что я использую для вывода xml.

8 голосов
/ 29 января 2009

Как это не совместимо с C #? Boolean.Parse и Boolean.TryParse нечувствительны к регистру, и разбор выполняется путем сравнения значения с Boolean.TrueString или Boolean.FalseString, которые имеют значения «True» и «False».

РЕДАКТИРОВАТЬ: При взгляде на метод Boolean.ToString в отражателе оказывается, что строки жестко закодированы, поэтому метод ToString выглядит следующим образом:

public override string ToString()
{
    if (!this)
    {
        return "False";
    }
    return "True";
}
5 голосов
/ 28 октября 2013

Я знаю причину, по которой он уже решен, но когда дело доходит до «пользовательского» логического форматирования, у меня есть два метода расширения, без которых я больше не могу жить :-)

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

Использование тривиально. Следующее преобразует различные значения bool в их португальские представления:

string verdadeiro = true.ToString("verdadeiro", "falso");
string falso = false.ToString("verdadeiro", "falso");
bool? v = null;
string nulo = v.ToString("verdadeiro", "falso", "nulo");
0 голосов
/ 11 ноября 2014

Причина true в "Истине" в том, что Microsoft тесно связана со стандартами XML.

Из Википедия : «Расширяемый язык разметки (XML) - это язык разметки, который определяет набор правил для кодирования документов в формате, который является читаемым человеком и машиночитаемым."

Человекочитаемый субъективен, но в глазах XML предпочтительнее использовать слово «один» вместо числа «1». Вы заметите, что это происходит с использованием перечислений, так как слово сериализуется вместо его значения («FirstOption» вместо «0» или «1»).

Аналогично, текст обычно следует за CamelCasing . Поэтому вместо «строка» XML предпочитает «строка». Вот почему Boolean.TrueString имеет значение «True», а Boolean.FalseString по умолчанию «False».

0 голосов
/ 29 января 2009

Это, вероятно, исходит из старых VB NOT. Net дней, когда bool.ToString произвел True или False.

...