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.