Boolean.ToString이 "true"가 아닌 "True"를 출력하는 이유


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


1
방금 이것을 언급한다고 생각했습니다 ... msdn 블로그에서 "True"를 C #의 부울 유형으로 역 직렬화하는 영리한 해결 방법을 읽었습니다! 참조 http://blogs.msdn.com/helloworld/archive/2009/04/03/workaround-to-deserialize-true-false-using-xmlserializer.aspx
— 피터

23
나는 대체 할 것 return b.ToString().ToLower();으로 return b ? "true" : "false";. 깨끗하고 효율적이며 이론적으로 로케일에 의존 할 수있는 방법에 덜 의존적입니다 (현재 구현에는 없지만).
— 존 한나

1
RestSharp를 사용하여 객체의 공개 속성을 QueryString으로 직렬화하여 REST WebService 호출을 할 때도 상당히 성가신 일입니다. REST API가 부울에 대해 대소 문자를 구분하는 경우 (예 : Google Directions API) API 호출이 실패합니다.
— Carlos P

8
"ToString은 .NET Framework의 주요 형식화 방법입니다. 개체를 문자열 표현으로 변환하여 표시 하기에 적합 합니다 ." (Emphasis mine). Object.ToString은 직렬화 메커니즘 이 아닙니다 . :)
— Rytmis

1
@awe 그렇습니다. 이론상 위험이 현재 발생하지 않더라도이를 방지 할 수있는 일종의 경험입니다.
— Jon Hanna

답변:


165

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) 메소드는 제공자 매개 변수가있는 대부분의 메소드와 달리 문화권 별 설정을 반영하지 않음을 의미합니다.

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


2
내가 틀렸다면 정정하되,에 대한 설명에서 잘못된 점이 보이지 않습니다 Boolean.ToString(). bool.TrueString하드 코딩 된 리터럴 "True" 를 포함하는 읽기 전용 필드입니다 . 따라서 반환하는 것은 문자열을 반환하면 항상 참조가 아닌 값을 반환한다는 점에서 저장된 TrueString하드 코딩 된 리터럴 "True" 를 반환하는 것과 같습니다.
— Fernando Neira

21
관찰 가능한 결과는 동일합니다. 구현은 아닙니다.
— Vojislav Stojkovic

1
C #을 컴파일해도 컴파일 된 결과에서 Boolean.TrueString이 "True"로 바뀌지 않습니다. 실제로 Boolean.TrueString을 사용한 경우 리플렉션을 사용하여 Boolean.TrueString을 변경하여 소문자 버전을 반환 할 수 있습니다. 소문자 변형을 반환하도록 부울에서 ToString 메서드를 대체하기 위해 리플렉션을 사용할 수 있습니다.
— 듀이 보젤

2
@FernandoNeira, 만약 내일 하드 코드 된 리터럴 TrueString이 소문자 "true"로 변경된다면,이 방법 bool.ToString()은 여전히 ​​파스칼 케이스 "True"리터럴을 반환 할 것입니다.
— Serge

1
True 및 False를 리터럴 값으로 사용하는 Visual Basic을 비난합니다.
— mrcrowl

105

.... 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'유형으로 표시합니다.)


4
그들은 외모에서 VB를 수용해야했습니다
— Chris S

5
C #이 "홀수"언어라고 말할 것입니다. .NET에 공개 된 모든 것은 CamelCase-System.Boolean, True, System.String 등-C #의 C 유산으로 String to string, Boolean to bool, True to true 등으로 이어집니다 (개인 선호도는 여전히 C #).
— stusmith

4
또한 @John Burns와 같이 VB를 사용할 때 특히 CamelCase로 만드는 것은 어렵지만 소문자로 쉽게 변환 할 수있는 좋은 이유는 무엇입니까? 그렇지 않으면 VB 사용자는를 사용할 수 없으며 사용할 수 없으며 ToString()강제로 사용 If(b, "True", "False")합니다. 그래서 나와 같은 C # 사용자는 다음을 사용하기 위해 희생해야합니다 ToLower():)
— CallMeLaNN

2
@MarkLopez 귀하의 의견이 올바르지 않습니다 . 여기를 참조하십시오 : msdn.microsoft.com/en-us/library/c8f5xwh7.aspx . 또한 부울 정의를 살펴보면 실제로는 구조체이며 두 속성이 동일한 속성을 갖습니다.
— tsemer

1
귀하의 답변에 약간의 빛이 비추지만 "참"이 "참"보다 "표준"인 방법을 이해하지 못합니다. 후자가 훨씬 더 인기가있는 것 같습니다.
— 약간

50

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


4
이것은 가장 우아한 방법으로 보입니다. 추가 프로그래밍이 필요 없으며 실제로 xml 출력을 위해 공식 라이브러리를 사용했습니다.
— Nyerguds

25

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

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

true.ToString().ToLower() 

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


많은 언어를 지원하기 때문에 @stusmith 답변 외에도 Microsoft가 부울 ToString()결과 의 VB 모양을 선호하는 좋은 이유 입니다.
— CallMeLaNN

@Damieh : 실제로 질문은 "왜"입니다. 선택한 답변은 이와 달리 실제로 최대한 답변에 가깝습니다.
— Nyerguds

1
더 나은 아직; ToLowerInvariant().
— vulcan raven

3
System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToTitleCase를 사용하여 "true"를 "True"로 다시 변환 할 수 있습니다.
— Jenny O'Reilly

8

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

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

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

23
와우 ... 아마도 C #에서 "if (! this)"구문이 유효한 유일한 문맥 일 것입니다!
— Tamas Czinege

2
그래서 왜 "거짓"을 반환하지 않는지 물어 보는 것입니다
— Chris S

이상한 일이 ... 조건을 거꾸로하는 거에요
— nicodemus13

6
@TamasCzinege That's probably the only context in C# where the construct "if (!this)" is valid! 당신은 나에게 도전했다. gist.github.com/Steinblock/10df18afb948866be1ba - 또한 오늘 조지 부울의 200 birtday입니다
— 위르겐 Steinblock

왜 이렇게하지 않았는지 궁금 return this ? "True" : "False";하십니까? (당신과 같은 또 다른 특이한 경우는 종종 볼 수 없습니다 thisA와 ?:조건,하지만 여기가 의미가있다.)
— 대럴 호프만에게

7

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

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

"확장 메소드를 사용하여 클래스 또는 인터페이스를 확장 할 수는 있지만이를 재정의 할 수는 없습니다. 인터페이스 또는 클래스 메소드와 이름 및 서명이 동일한 확장 메소드는 호출되지 않습니다. 컴파일시 확장 메소드는 항상 우선 순위보다 낮은 우선 순위를 갖습니다. 유형 자체에 정의 된 인스턴스 메소드. " 솔루션이 작동합니까? (어쩌면 ToString ()이 상속되어 재정의 될 수 있습니까?)
— jwize

1
내 이전 의견에 따르면이 서명은 아무것도 무시하지 않습니다.
— jwize

@jwize 네, 이것들은 새로운 서명이므로 오버라이드가 아닙니다. ;-)
— Loudenvier

0

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

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

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

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


7
"참"이 아니라 "참"으로 설정하면 XML 부울이 중단된다는 것이 재밌습니까? - "XML은 대소 문자를 구분하며 XML 사양은"true "및"false "를 유효한 부울 값 세트로 인식합니다.
— PandaWood

-1

이것은 bool.ToString이 True 또는 False를 생성 한 이전 VB NOT .Net 시절부터 발생했을 수 있습니다.


3
.NET 이전에는 VB의 부울 데이터 유형 (실제로 모든 데이터 유형)에 메소드가 없었습니다.
— Sam Ax

1
VB6에서는 부울 유형을 문자열로 변환 할 수 있습니다 (문자열 변수에 지정하는 가장 간단한 방법). 이것에 대한 이상한 점은 변환이 실제로 문화에 따라 다르다는 것입니다. 따라서 실행중인 컴퓨터의 문화 언어가 노르웨이어 인 경우 결과는 "True"및 "False"대신 "Sann"및 "Usann"입니다! 부울 설정이 텍스트 파일에 저장되고 컴퓨터가 영어 (미국) 문화로 설정된 다른 환경으로 내보내는 경우 종종 문제가 발생했습니다.
— awe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.