Boolean.ToString neden “true” değil “True” üretir


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

Output:
True
False

Bunun "doğru" ve "doğru" olmamasının geçerli bir nedeni var mı? XML yazarken XML'in boolean türü gibi kırar küçük harf olduğu ve aynı zamanda (değil emin CLS gerçi yaklaşık) C # 'ın doğru / yanlış ile uyumlu değildir.

Güncelleme

İşte C # (XML ile kullanım için) etrafında almak çok hacky yolu

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

Tabii ki bu yığına 1 yöntem daha ekler, ancak ToLowers () öğesini her yerde kaldırır.


1
Sadece bundan bahsettiğimi düşündüm ... Sadece msdn blogunda C # 'da bir boole türü olarak "True" dizisini kaldırmak için akıllı bir çözüm okudum! bkz. http://blogs.msdn.com/helloworld/archive/2009/04/03/workaround-to-deserialize-true-false-using-xmlserializer.aspx
Peter

23
Ben değiştirecekti return b.ToString().ToLower();ile return b ? "true" : "false";. Daha temiz, daha verimli, teorik olarak yerele bağlı olabilecek bir yönteme daha az bağımlı (mevcut uygulamalarda olmasa bile).
Jon Hanna

1
Bu, bir nesnenin genel özelliklerini bir REST WebService çağrısı yapmak için bir QueryString'e serileştirmek için RestSharp kullanıldığında da oldukça can sıkıcıdır. REST API'si bools için büyük / küçük harfe duyarlıysa (ör. Google Yol Tarifi API'sı) bu durum API çağrısının başarısız olmasına neden olur.
Carlos P

8
"ToString, .NET Framework'teki ana biçimlendirme yöntemidir. Bir nesneyi görüntüleme için uygun olacak şekilde dize temsiline dönüştürür ." (Vurgu madeni). Object.ToString bir serileştirme mekanizması değildir . :)
Rytmis

1
@ evet, şu anda olmamasına rağmen teorik riske karşı korunmamı sağlayan bir deneyim.
Jon Hanna

Yanıtlar:


165

Bu soruyu yalnızca Microsoft'tan insanlar yanıtlayabilir. Ancak, bu konuda bazı eğlenceli gerçekler sunmak istiyorum;)

İlk olarak, MSDN'de Boolean.ToString () yöntemi hakkında söylediği budur :

Geri dönüş değeri

Tür: System.String

TrueString bu örneğin değeri doğruysa, ya FalseString bu örneğin değeri false.

Uyarılar

Bu yöntem "True" veya "False" sabitlerini döndürür. XML'in büyük / küçük harfe duyarlı olduğunu ve XML belirtiminin "true" ve "false" değerlerini geçerli Boole değerleri kümesi olarak tanıdığını unutmayın. ToString () yöntemi tarafından döndürülen String nesnesi bir XML dosyasına yazılacaksa, önce küçük harfe dönüştürmek için önce String.ToLower yöntemi çağrılmalıdır.

İşte eğlenceli gerçek # 1: TrueString veya FalseString'i geri döndürmez. "True" ve "False" sabit kodlu değişmezlerini kullanır. Eğer alanları kullanmış olsaydı size hiçbir faydası olmaz, çünkü bunlar salt okunur olarak işaretlenmiştir, bu yüzden onları değiştiremezsiniz.

Alternatif yöntem Boolean.ToString (IFormatProvider) daha da komik:

Uyarılar

Sağlayıcı parametresi ayrılmıştır. Bu yöntemin uygulanmasına katılmaz. Bu, bir sağlayıcı parametresine sahip çoğu yöntemin aksine, Boolean.ToString (IFormatProvider) yönteminin kültüre özgü ayarları yansıtmadığı anlamına gelir.

Çözüm nedir? Tam olarak ne yapmaya çalıştığınıza bağlıdır. Her ne ise, bahse girerim bir kesmek gerektirir;)


2
Yanılıyorsam beni düzeltin ama açıklamasında yanlış bir şey görmüyorum Boolean.ToString(). bool.TrueStringsabit kodlu değişmez "True" ifadesini içeren salt okunur bir alandır . Bu nedenle, geri döndüğünü TrueStringsöylemek , bir dize döndürmenin bir referans değil her zaman değeri döndürdüğü göz önüne alındığında, içinde saklanan sabit kodlu değişmez "True" ifadesini döndürdüğünü söylemekle aynıdır .
Fernando Neira

21
Gözlenebilir sonuç aynıdır. Uygulama değil.
Vojislav Stojkovic

1
Derlenmiş sonuçlarda C # derlemek Boolean.TrueString "True" ile yerini almaz. Eğer gerçekten Boolean.TrueString'i kullanıyorlarsa, o zaman neyin kırılacağını bilen küçük bir versiyonu döndürmek için Boolean.TrueString'i değiştirmek için yansımayı kullanabilirsiniz. Boolean'daki ToString yöntemini değiştirmek için yansıma kullanabilirsiniz, böylece küçük harfli varyantları döndürür.
Dewey Vozel

2
@FernandoNeira, yarın sabit kodlu değişmez TrueStringdeğeri örneğin "true" küçük harfine değiştirilirse, yöntem bool.ToString()yine de pascal durum "True" değişmezini döndürür.
Serge

1
Gerçek değerleri olarak True ve False kullanan Visual Basic'i suçluyorum.
mrcrowl

105

... çünkü .NET ortamı birçok dili destekleyecek şekilde tasarlanmıştır.

System.Boolean (mscorlib.dll dosyasında), boole veri türünü desteklemek için diller tarafından dahili olarak kullanılmak üzere tasarlanmıştır. C #, anahtar kelimeleri için tüm küçük harfleri kullanır, dolayısıyla 'bool', 'true' ve 'false'.

Ancak VB.NET standart kasa kullanır: dolayısıyla 'Boolean', 'True' ve 'False'.

Dillerin birlikte çalışması gerektiğinden, True.ToString () (VB.NET) için farklı bir sonuç veren true.ToString () (C #) yapamazsınız. CLR tasarımcıları, ToString () sonucu için standart CLR kasa gösterimini seçti.

Boolean true değerinin dize olarak temsil edilmesi Boolean.TrueString olarak tanımlanır.

(System.String ile benzer bir durum vardır: C # 'string' türü olarak sunar).


4
VB'yi şeylerin görünüşünden karşılamak zorunda kaldılar
Chris S

5
C # "garip" dil olduğunu söyleyebilirim. .NET'te herkese açık olan her şey CamelCase - System.Boolean, True, System.String vb. hala C #).
Stusmith

4
Ek olarak, (benim için) küçük harfe dönüştürmenin iyi bir nedeni kolayken, özellikle VB de @John Burns'ün dediği gibi CamelCase yapmak zor. Aksi takdirde VB kullanıcısı kullanamaz ve asla kullanmaz ve böyle kullanmak ToString()zorunda kalır If(b, "True", "False"). Benim gibi c # kullanıcı kullanmak için fedakarlık gerekir ToLower():)
CallMeLaNN

2
@MarkLopez Yorumunuz yanlış, buraya bakın : msdn.microsoft.com/en-us/library/c8f5xwh7.aspx . Ayrıca, Boole tanımına bakmak aslında bir yapı olduğunu ve ikisinin de aynı özelliklere sahip olduğunu ortaya koymaktadır.
tsemer

1
Cevabınız biraz ışık saçarken, "Doğru" nun "gerçek" ten daha "standart" olduğunu anlamıyorum. İkincisi çok daha popüler gibi görünüyor.
hafif

50

Xml için XmlConvert.ToString yöntemini kullanabilirsiniz .


4
Bu, en zarif yöntem gibi görünüyor. Ekstra programlama ve aslında xml çıktısı için oluşturulan resmi bir kütüphane kullanarak.
Nyerguds

25

Bunu küçük harfe dönüştürmek için basit bir kod.

Ancak, "true" değerini tekrar "True" olarak dönüştürmek o kadar kolay değil.

true.ToString().ToLower() 

xml çıktısı için kullandığım şey bu.


@Stusmith cevabına ek olarak, birçok dili desteklemek için, Microsoft'un Boole ToString()sonucunun VB görünümünü tercih etmesinin güzel bir nedeni budur .
CallMeLaNN

@Damieh: aslında soru "Neden". Seçilen cevap, bunun aksine, aslında cevaplamaya olabildiğince yakındır.
Nyerguds

1
Daha iyisi; ToLowerInvariant().
vulcan raven

3
System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToTitleCase komutunu kullanarak "true" öğesini tekrar "True" biçimine dönüştürebilirsiniz.
Jenny O'Reilly

8

C # ile nasıl uyumlu değildir? Boolean.Parse ve Boolean.TryParse büyük / küçük harf duyarsızdır ve ayrıştırma değeri "True" ve "False" olan Boolean.TrueString veya Boolean.FalseString ile karşılaştırılarak yapılır.

DÜZENLEME: Reflektördeki Boolean.ToString yöntemine bakıldığında, dizelerin sabit kodlanmış olduğu ve ToString yönteminin aşağıdaki gibi olduğu ortaya çıkar:

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

23
Vay canına ... C # 'da "if (! This)" yapısının geçerli olduğu tek bağlam muhtemelen budur!
Tamas Czinege

2
neden sorduğum şey "yanlış" değil
Chris S

Ne tuhaf bir şey ... Yani durumu tersine çevirmek.
nicodemus13

6
@TamasCzinege That's probably the only context in C# where the construct "if (!this)" is valid! Bana meydan okudun , kaybettin . gist.github.com/Steinblock/10df18afb948866be1ba - Ayrıca bugün George Boole 200. birtday olan
Jürgen Steinblock

Bunun neden böyle yapılmadığını merak ediyor return this ? "True" : "False";musunuz? (Sıklıkla thisbir ?:koşul olarak görmediğiniz için alışılmadık bir durum, ama burada mantıklı olurdu.)
Darrel Hoffman

7

Zaten ele alınmış olmasının nedenini biliyorum, ancak "özel" boolean biçimlendirme söz konusu olduğunda, artık onsuz yaşayamayacağım iki uzatma yöntemim var :-)

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

Kullanımı önemsizdir. Aşağıdaki çeşitli bool değerlerini Portekizce temsillerine dönüştürür:

string verdadeiro = true.ToString("verdadeiro", "falso");
string falso = false.ToString("verdadeiro", "falso");
bool? v = null;
string nulo = v.ToString("verdadeiro", "falso", "nulo");

"Bir sınıfı veya arabirimi genişletmek için genişletme yöntemlerini kullanabilirsiniz, ancak bunları geçersiz kılmamak için kullanabilirsiniz. Arabirim veya sınıf yöntemiyle aynı ada ve imzaya sahip bir genişletme yöntemi hiçbir zaman çağrılmaz. Derleme zamanında, genişletme yöntemleri her zaman öncekinden daha düşük önceliğe sahiptir. türün kendisinde tanımlanan örnek yöntemler. " Çözümünüz çalışıyor mu (belki (ToString) overriden olabilir bu nedenle kalıtsaldır?)?
jwize

1
Önceki yorumuma göre bu imza hiçbir şeyi geçersiz kılmıyor.
jwize

@jwize evet, bunlar yeni imzalar, bu yüzden bir aşırı yük değil bir aşırı yük ;-)
Loudenvier

0

Nedeni true"Doğru" Microsoft'un XML standartlarına güçlü bağından kaynaklanıyor.

Gönderen Wikipedia : "Genişletilebilir İşaretleme Dili (XML) hem bir formatta belgeleri kodlamak için bir dizi kural tanımlayan bir işaretleme dilidir insan tarafından okunabilir ve makine tarafından okunabilir."

İnsan tarafından okunabilir özneldir, ancak XML'in gözünde "1" yerine "Bir" kelimesinin kullanılması tercih edilir. Sözcük değeri yerine serileştirildiğinden ("0" veya "1" yerine "FirstOption") bunun numaralandırmalar kullanarak gerçekleştiğini fark edeceksiniz.

Benzer şekilde, metin genellikle CamelCasing'i takip eder . Bu nedenle, XML "string" yerine "String" i tercih eder. Bu nedenle Boolean.TrueString "True" ve Boolean.FalseString varsayılan olarak "False" dır.


7
Eğer o zaman "doğru" değil "Doğru" olarak ayarlarsanız XML boole kırılacak komik mi? - "XML'in büyük / küçük harfe duyarlı olduğunu ve XML belirtiminin" true "ve" false "
ifadesini

-1

Bu muhtemelen bool.ToString True veya False ürettiğinde eski VB NOT. Net günlerinden kaynaklanıyor.


3
.NET'ten önce VB'deki Boolean veri türünün (aslında tüm veri türlerinin) yöntemleri yoktu.
Sam Axe

1
VB6'da, Boolean türünü dizeye dönüştürebilirsiniz (bir String değişkenine atamanın en basit yolu). Bununla ilgili garip olan şey, dönüşümün aslında kültüre özgü olmasıydı, bu nedenle çalışan bilgisayardaki kültür diliniz Norveçliyse, sonuç "Doğru" ve "Yanlış" yerine "Sann" ve "Usann" oldu! Boolean ayarları bir metin dosyasında depolanır ve bilgisayarın İngilizce (ABD) kültürüyle ayarlandığı farklı bir ortama aktarılırsa bu genellikle sorunlara neden olur.
huşu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.