[C#] Boolean.ToString이 “true”가 아닌 “True”를 출력하는 이유

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 ()를 제거합니다.



답변

Microsoft의 사람들 만이 그 질문에 실제로 대답 할 수 있습니다. 그러나 나는 그것에 대해 재미있는 사실을 제시하고 싶습니다.)

먼저 Boolean.ToString () 메서드에 대해 MSDN에서 다음과 같이 말합니다 .

반환 값

유형 : System.String

TrueString 이 인스턴스의 값에 해당하는 경우, 또는 FalseString 이 인스턴스의 값이 false 인 경우.

비고

이 메소드는 상수 “True”또는 “False”를 리턴합니다. XML은 대소 문자를 구분하며 XML 사양은 “true”및 “false”를 유효한 부울 값 집합으로 인식합니다. ToString () 메서드에서 반환 한 String 개체를 XML 파일에 쓰려면 먼저 String.ToLower 메서드를 호출하여 소문자로 변환해야합니다.

재미있는 사실 # 1이 있습니다 : TrueString 또는 FalseString을 전혀 반환하지 않습니다. 하드 코딩 된 리터럴 “True”및 “False”를 사용합니다. 필드가 읽기 전용으로 표시되어 있으므로 변경하지 않으므로 필드를 사용하면 아무 소용이 없습니다.

대체 방법 인 Boolean.ToString (IFormatProvider) 이 훨씬 더 재미 있습니다.

비고

제공자 매개 변수가 예약되어 있습니다. 이 방법의 실행에는 참여하지 않습니다. 이것은 Boolean.ToString (IFormatProvider) 메소드는 제공자 매개 변수가있는 대부분의 메소드와 달리 문화권 별 설정을 반영하지 않음을 의미합니다.

해결책은 무엇입니까? 정확히하려는 일에 따라 다릅니다. 그것이 무엇이든간에 그것은 해킹이 필요할 것입니다.)


답변

…. NET 환경은 많은 언어를 지원하도록 설계 되었기 때문에.

mscorlib.dll의 System.Boolean은 부울 데이터 형식을 지원하기 위해 언어에 의해 내부적으로 사용되도록 설계되었습니다. C #은 키워드에 모두 소문자를 사용하므로 ‘bool’, ‘true’및 ‘false’입니다.

그러나 VB.NET은 표준 케이싱을 사용하므로 ‘Boolean’, ‘True’및 ‘False’입니다.

언어가 함께 작동해야하므로 True.ToString () (C #)을 사용하여 True.ToString () (VB.NET)에 다른 결과를 제공 할 수 없습니다. CLR 설계자는 ToString () 결과에 대한 표준 CLR 케이싱 표기법을 선택했습니다.

부울 true의 문자열 표현은 Boolean.TrueString으로 정의됩니다.

(System.String과 비슷한 경우가 있습니다. C #은 ‘string’유형으로 표시합니다.)


답변

Xml의 경우 XmlConvert.ToString 메서드를 사용할 수 있습니다 .


답변

그것을 모두 소문자로 변환하는 간단한 코드입니다.

그러나 “true”를 “True”로 다시 변환하는 것은 그리 간단하지 않습니다.

true.ToString().ToLower() 

xml 출력에 사용하는 것입니다.


답변

C #과 어떻게 호환되지 않습니까? Boolean.Parse 및 Boolean.TryParse는 대소 문자를 구분하지 않으며 값을 “True”및 “False”인 Boolean.TrueString 또는 Boolean.FalseString과 비교하여 구문 분석을 수행합니다.

편집 : 리플렉터에서 Boolean.ToString 메서드를 볼 때 문자열이 하드 코딩되어 ToString 메서드는 다음과 같습니다.

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


답변

나는 그것이 이미 해결 된 방식 인 이유를 알고 있지만 “사용자 정의”부울 형식에 관해서는 더 이상 살 수없는 두 가지 확장 방법을 가지고 있습니다 🙂

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


답변

이유 true “참”때문에 XML 표준과 마이크로 소프트의 강한 유대이다.

에서 위키 백과 : “XML (Extensible Markup Language)은 둘 다 형식으로 문서를 인코딩하는 일련의 규칙을 정의하는 마크 업 언어입니다 사람이 읽을 수 기계가 읽을 수.”

사람이 읽을 수있는 것은 주관적이지만 XML의 관점에서는 숫자 “1”대신 “One”이라는 단어를 사용하는 것이 좋습니다. 단어가 값 ( “0”또는 “1”대신 “FirstOption”) 대신 직렬화되므로 열거 형을 사용하여이 문제가 발생합니다.

마찬가지로 텍스트는 일반적으로 CamelCasing 뒤에옵니다 . 따라서 XML은 “문자열”대신 “문자열”을 선호합니다. 이것이 Boolean.TrueString이 “True”이고 Boolean.FalseString이 기본적으로 “False”인 이유입니다.