बूलियन क्यों करता है। आउटपुट "सही" और "सही" नहीं है।


235
true.ToString() 
false.toString();

Output:
True
False

क्या इसके "सत्य" होने का एक वैध कारण है और "सत्य" नहीं है? XML को लिखते समय यह टूट जाता है क्योंकि XML का बूलियन प्रकार निचला मामला है , और यह भी C # के सही / गलत (CLS के बारे में निश्चित नहीं है) के साथ संगत नहीं है।

अपडेट करें

यहाँ C # में इसे प्राप्त करने का मेरा बहुत ही आसान तरीका है (XML के साथ उपयोग के लिए)

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

बेशक जो स्टैक में 1 और विधि जोड़ता है, लेकिन हर जगह टोलवर्स () को हटा देता है।


1
बस सोचा था कि मैं इसका उल्लेख करूँगा ... मैंने अभी-अभी "सच" को एक एमएसडीएन ब्लॉग पर सी # में एक बूलियन प्रकार के रूप में वर्णन करने के लिए कुछ चतुर काम पढ़ा है! देख 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
यह भी काफी कष्टप्रद है जब किसी ऑब्जेक्ट के सार्वजनिक गुणों को क्रमबद्ध करने के लिए Restestharp का उपयोग करके एक Rest WebService कॉल करें। यदि REST API बूल के लिए केस-संवेदी है (जैसे Google दिशा API) तो इसके कारण API कॉल विफल हो जाता है।
कार्लोस पी

8
"। NET फ्रेमवर्क में प्रमुख प्रारूपण विधि है। यह एक वस्तु को इसके स्ट्रिंग प्रतिनिधित्व में परिवर्तित करता है ताकि यह प्रदर्शन के लिए उपयुक्त हो ।" (जोर मेरा)। Object.ToString एक क्रमांकन तंत्र नहीं है । :)
Rytmis

1
@ हाँ, यह उस तरह का अनुभव है जो मुझे सैद्धांतिक जोखिम से बचाता है भले ही वर्तमान में ऐसा नहीं होता है।
जॉन हैना

जवाबों:


165

केवल Microsoft के लोग ही उस प्रश्न का उत्तर दे सकते हैं। हालाँकि, मैं इसके बारे में कुछ मज़ेदार तथ्य प्रस्तुत करना चाहता हूँ;)

सबसे पहले, यह बूलियन के बारे में MSDN में कहती है। String () विधि:

प्रतिलाभ की मात्रा

प्रकार: System.String

TrueString यदि इस उदाहरण का मान सही है, या FalseString है यदि इस उदाहरण का मान गलत तो ।

टिप्पणियों

यह विधि स्थिरांक "सही" या "गलत" लौटाती है। ध्यान दें कि XML केस-संवेदी है, और यह कि XML विनिर्देश बूलियन मानों के मान्य सेट के रूप में "सही" और "गलत" को पहचानता है। यदि स्ट्रिंग ऑब्जेक्ट ToString () विधि द्वारा किसी XML फ़ाइल में लिखा जाना है, तो उसके String.ToLower विधि को सबसे पहले इसे लोअरकेस में बदलने के लिए कहा जाना चाहिए।

यहाँ मज़ेदार तथ्य # 1 आता है: यह TrueString या FalseString बिल्कुल नहीं लौटाता है। यह हार्डकोडेड शाब्दिक "ट्रू" और "गलत" का उपयोग करता है। यदि आप खेतों का उपयोग करते हैं, तो यह आपको अच्छा नहीं करेगा, क्योंकि वे आसानी से चिह्नित हैं, इसलिए उन्हें कोई परिवर्तन नहीं हुआ है।

वैकल्पिक विधि, Boolean.ToString (IFormatProvider) और भी मजेदार है:

टिप्पणियों

प्रदाता पैरामीटर आरक्षित है। यह इस पद्धति के निष्पादन में भाग नहीं लेता है। इसका मतलब यह है कि बूलियन.ट्रोस्ट्रिंग (IFormatProvider) विधि, एक प्रदाता पैरामीटर के साथ अधिकांश विधियों के विपरीत, संस्कृति-विशिष्ट सेटिंग्स को प्रतिबिंबित नहीं करती है।

इसका क्या उपाय है? निर्भर करता है कि वास्तव में आप क्या करने की कोशिश कर रहे हैं। जो कुछ भी है, मुझे यकीन है कि इसे हैक की आवश्यकता होगी;)


2
अगर मैं गलत हूं तो मुझे सुधारो, लेकिन मैं स्पष्टीकरण के लिए कुछ भी गलत नहीं देखता हूं Boolean.ToString()bool.TrueStringकेवल पढ़ने योग्य फ़ील्ड है जिसमें हार्डकोडेड शाब्दिक "ट्रू" है । इसलिए, यह कहते हुए कि यह रिटर्न TrueStringवही है जो यह कहता है कि यह हार्डकोडेड शाब्दिक "ट्रू" को इसमें संग्रहीत करता है, यह देखते हुए कि रिटर्निंग स्ट्रिंग हमेशा मान लौटाता है न कि संदर्भ।
फर्नांडो नीरा

21
अवलोकनीय परिणाम वही है। कार्यान्वयन नहीं है।
वोजिस्लाव स्टोजकोविक

1
संकलित परिणामों में C # को संकलित करना Boolean.TrueString को "True" से प्रतिस्थापित नहीं करेगा। अगर वे वास्तव में बूलियन का उपयोग करते हैं। ट्रूस्ट्रिंग तो आप एक लोअरकेस संस्करण को वापस करने के लिए बूलियन को बदलने के लिए प्रतिबिंब का उपयोग कर सकते हैं ... निश्चित रूप से कौन जानता है कि जो टूट जाएगा। आप अभी भी प्रतिबिंब का उपयोग बूलियन पर टोस्ट्रिंग विधि को बदलने के लिए कर सकते हैं ताकि यह निचला केस वेरिएंट लौटाए।
डेवी वोजेल

2
@ फर्नांडो नीरा, अगर कल हार्डकॉटल शाब्दिक TrueStringको बदल दिया जाए, तो "सच" को कम करने के लिए, विधि bool.ToString()अभी भी पास्कल केस "ट्रू" शाब्दिक लौटा देगी।
सर्ग

1
मैं Visual Basic को दोष देता हूं, जो अपने शाब्दिक मूल्यों के रूप में True और False का उपयोग करता है।
mrcrowl

105

... क्योंकि .NET वातावरण कई भाषाओं का समर्थन करने के लिए डिज़ाइन किया गया है।

System.Boolean (mscorlib.dll में) को बूलियन डेटाटाइप का समर्थन करने के लिए भाषाओं द्वारा आंतरिक रूप से उपयोग करने के लिए डिज़ाइन किया गया है। C # अपने कीवर्ड के लिए सभी लोअरकेस का उपयोग करता है, इसलिए 'बूल', 'सत्य' और 'गलत' है।

VB.NET हालांकि मानक आवरण का उपयोग करता है: इसलिए 'बूलियन', 'ट्रू' और 'गलत'।

चूंकि भाषाओं को एक साथ काम करना है, आप true.ToString () (C #) True.ToString () (VB.NET) को एक अलग परिणाम दे सकते हैं। CLR डिजाइनरों ने ToString () परिणाम के लिए मानक CLR आवरण संकेतन उठाया।

बूलियन ट्रू का स्ट्रिंग प्रतिनिधित्व बूलियन माना जाता है।

(System.String के साथ एक समान मामला है: C # इसे 'स्ट्रिंग' प्रकार के रूप में प्रस्तुत करता है)।


4
उन्हें वीबी को चीजों के लुक से समायोजित करना पड़ा
क्रिस एस

5
मैं कहूंगा कि C # "विषम" भाषा है। .NET में सब कुछ सार्वजनिक है CamelCase - System.Boolean, True, System.String, इत्यादि - यह C # की C धरोहर है जो String to al stringing को string, Boolean to bool, True to true, इत्यादि की ओर ले जाती है (हालाँकि मेरी व्यक्तिगत प्राथमिकता है) अभी भी सी #)।
stusmith

4
इसके अतिरिक्त, अच्छा कारण (मेरे लिए) लोअर केस में परिवर्तित करना आसान है, जबकि इसे कैमेलकेज़ बनाना कठिन है, खासकर जब वीबी का उपयोग किया जाता है, जैसे @ जॉर्न बर्न्स ने कहा। अन्यथा 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.ToString().ToLower() 

मैं xml आउटपुट के लिए क्या उपयोग करता हूं।


@Stusmith जवाब के अलावा क्योंकि कई भाषाओं के समर्थन के लिए, यह अच्छा कारण है कि Microsoft बूलियन ToString()परिणाम का VB लुक पसंद करता है ।
CallMeLaNN

@ दामिह: वास्तव में, सवाल "क्यों" है। इसके विपरीत चयनित उत्तर, वास्तव में उत्तर देने के करीब आता है जितना कि वह कर सकता है।
Nyerguds

1
और भी बेहतर; ToLowerInvariant()
वल्केन रैवेन

3
आप "True" को "True" में बदलने के लिए System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToTitleCase का उपयोग कर सकते हैं।
जेनी ओ'रिली ने

8

यह C # के साथ कैसे संगत नहीं है? Boolean.Parse और Boolean.TryParse केस असंवेदनशील है और मान को Boolean.TrueString या Boolean.FalseString के मान की तुलना करके किया जाता है जो "True" और "गलत" हैं।

संपादित करें: जब परावर्तक में बूलियन.ट्रोस्ट्रिंग विधि को देखते हुए यह पता चलता है कि तार कठिन कोडित हैं इसलिए ToString विधि निम्नानुसार है:

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

23
वाह ... यह सी # में शायद एकमात्र संदर्भ है जहां निर्माण "अगर (!)" वैध है!
तमस Czinege

2
तो यह "झूठा" क्यों नहीं है जो मैं पूछ रहा हूं
क्रिस एस

क्या अजीब बात है ... मेरा मतलब है कि हालत को उलटा करो।
निकोडेमस 13

6
@TamasCzinege That's probably the only context in C# where the construct "if (!this)" is valid! आपने मुझे चुनौती दी, आप ढीले हैं। gist.github.com/Steinblock/10df18afb948866be1ba - आज भी जॉर्ज
बोले

आश्चर्य है कि ऐसा क्यों नहीं किया गया return this ? "True" : "False";? (एक और असामान्य मामला जैसा कि आप अक्सर thisएक ?:शर्त के रूप में नहीं देखते हैं, लेकिन यहाँ यह समझ में आता है।)
डारेल हॉफमैन

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

@ हाँ, ये नए हस्ताक्षर हैं, इसलिए यह एक अधिभार नहीं है
;;

0

इसका कारण true"ट्रू" है, क्योंकि Microsoft XML मानकों के साथ मजबूत बंधन है।

से विकिपीडिया : "एक्सटेंसिबल मार्कअप लैंग्वेज (XML) एक मार्कअप भाषा है कि एक प्रारूप है जो दोनों है में दस्तावेजों एन्कोड करने के लिए नियमों का एक सेट को परिभाषित करता है मानव पठनीय और मशीन पठनीय।"

मानव-पठनीय व्यक्तिपरक है, लेकिन एक्सएमएल की नजर में, "1" शब्द का उपयोग संख्या "1" के स्थान पर पसंद किया जाता है। आप ध्यान देंगे कि यह एनम का उपयोग करते हुए होता है, क्योंकि यह शब्द इसके मूल्य ("FirstOption" के बजाय "0" या "1") के बजाय क्रमबद्ध हो जाता है।

इसी तरह, टेक्स्ट आमतौर पर CamelCasing का अनुसरण करता है । इसलिए, "स्ट्रिंग" के बजाय, XML "स्ट्रिंग" पसंद करता है। यही कारण है कि Boolean.TrueString "True" है और Boolean.FalseString डिफ़ॉल्ट रूप से "गलत" है।


7
अगर आप इसे "ट्रू" पर सेट करते हैं और "ट्रू" नहीं तो "एक्सएमएल बूलियन" टूट जाएगा? - "ध्यान दें कि XML केस-संवेदी है, और यह कि XML विनिर्देशन" सच "और" असत्य "को बूलियन मानों के मान्य सेट के रूप में
पहचानता है

-1

यह संभवत: पुराने VB NOT। नेट के दिनों से है जब bool.ToString ट्रू या फाल्स का उत्पादन करता है।


3
.NET से पहले VB में बूलियन डेटा प्रकार (वास्तव में, सभी डेटा प्रकार) में विधियाँ नहीं थीं।
सैम एक्सएक्स

1
VB6 में, आप अभी भी बूलियन प्रकार को स्ट्रिंग में बदल सकते हैं (इसे स्ट्रिंग चर को निर्दिष्ट करने का सबसे सरल तरीका)। इसके बारे में अजीब बात यह थी कि, रूपांतरण वास्तव में संस्कृति विशिष्ट था, इसलिए यदि चल रहे कंप्यूटर पर आपकी संस्कृति भाषा नॉर्वेजियन थी, तो परिणाम "ट्रू" और "गलत" के बजाय "सन्न" और "उस्न्न" था! यदि बूलियन सेटिंग्स को टेक्स्ट फ़ाइल में संग्रहीत किया जाता था, और एक अलग वातावरण में निर्यात किया जाता था, जहां कंप्यूटर अंग्रेजी (यूएस) संस्कृति के साथ स्थापित किया गया था, तो यह अक्सर समस्या का कारण बनता है।
विस्मय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.