2009-12-14 11 views
55

Dlaczego zdecydowano, że podczas analizowania wartość logiczną, 0/1 nie są dopuszczalne?Convert.ToBoolean i Boolean.Parse nie akceptują 0 i 1

Podczas analizowania dowolną wartość typu całkowitego, akceptuje ciągów liczbowych być analizowany. (I jeśli .NET może sparsować ciąg "Sto milionów dwieście sześćdziesiąt pięć tysięcy osiemset sześćdziesiąt pięć", byłbym zaskoczony).

Co sprawia, że ​​booleans jest wyjątkowy? Są zasadniczo 0 jako fałszywe, a niezerowe jako prawdziwe w moim doświadczeniu ...

Czy istnieje bcl metoda do analizowania ciąg tak, a jeśli nie, to dlaczego?

Uwaga: zapomniałem podać w ciąg "0" i "1". Ciekawe, że jeśli już int działa tak, jak się spodziewałem. Może to spowodowało zamieszanie.

Odpowiedz

58

0 i (nie-zero) nie jest równa "false" i "prawda" , są po prostu reprezentacją wybraną przez C. Inne języki używają 0 dla prawdziwych i -1 dla fałszywych lub innych schematów całkowicie. Wartość logiczna to , a nie a 0 lub 1, to prawda lub fałsz.

Czy powinien również obsługiwać "tak" i "nie", "wyłączony" i "włączony", a także wszystkie miriady innych rzeczy, które są analogiczne do booleans? Gdzie narysowałbyś linię?

+2

Dzięki! Tego właśnie szukałem, wyjaśnienia dlaczego. Jeśli niektóre języki rzeczywiście używają wartości 0 dla wartości true, a wartości -1 dla wartości false, szczerze myślę, że są spieprzone, ale jest to świetny powód, aby nie przyjmować automatycznie przez analizę, której niektórzy deweloperzy mogą używać na ślepo. –

+48

Dlaczego, tak. Tak, powinien obsłużyć tak/nie off/on. – WEFX

+2

Aby wyjaśnić, dlaczego niektóre języki używają wartości 0 dla wartości true i wartości -1 dla wartości false, należy rozważyć ich reprezentacje binarne: '00000000' i' 11111111'. – MCattle

22

Co sprawia booleans wyjątkowy? Zasadniczo są one 0 jako fałszywe, a niezerowe jako prawdziwe w moim doświadczeniu ...

To jest szczegół implementacyjny i nie ma żadnego znaczenia.

true jest wartość logiczna. false jest wartością logiczną. Coś jeszcze nie jest.

Jeśli chcesz analizować coś takiego, że ciąg „0” ocenia false natomiast cokolwiek innego ocenia true, można użyć:

!mystr.Equals("0"); 
+0

Ładne, zwięzłe rozwiązanie, proszę mi! – RemarkLima

+6

A ciąg "true" i ciąg "false" to ciągi znaków, a nie booleans. Jednak wydaje się, że nikt nie ma problemu z rozpoznaniem ich znaczenia przy zamianie ich na booleans. Jeśli jesteśmy wystarczająco inteligentni, aby uznać, że "prawda" oznacza prawdę, to myślę, że jesteśmy na tyle sprytni, aby rozpoznać, że "1" i "1" również są prawdziwe. A my jesteśmy na tyle sprytni, aby rozpoznać, że "na" i "tak" są afirmatywami, które można bezpiecznie przekonwertować na prawdziwe, jeśli programista konkretnie prosi o konwersję. – Rikaelus

3

Chcesz Convert.ToBoolean(int value) nie wiesz, co się dzieje z metodami analizowania :-)

Kod bezcelowy:

 int falseInt = 0; 
     int trueInt = 1; 

     bool falseBool; 
     bool trueBool; 

     if (bool.TryParse(falseInt.ToString(), out falseBool)) 
     { 
      if (!falseBool) 
      { 
       MessageBox.Show("TryParse: False"); 
      } 
     } 

     if (bool.TryParse(trueInt.ToString(), out trueBool)) 
     { 
      if (!trueBool) 
      { 
       MessageBox.Show("TryParse: True"); 
      } 
     } 

     falseBool = Convert.ToBoolean(falseInt); 
     trueBool = Convert.ToBoolean(trueInt); 

     if (!falseBool) 
     { 
      MessageBox.Show("Convert: False"); 
     } 

     if (trueBool) 
     { 
      MessageBox.Show("Convert: True"); 
     } 
8

Niestety, dzieje się tak bardzo w .NET. Na przykład nie pamiętam, czy jest to XML Serializer czy XmlConvert, ale jedno z nich zawiedzie, jeśli obudowa True/False nie jest poprawna.

Możesz zaokrąglić całkowitą liczbę podróży, aby uzyskać to, co chcesz.

string s = "2"; 
int i = Convert.ToInt32(s); 
bool b = Convert.ToBoolean(i); 

W powyższym przypadku cokolwiek niezerowe zostanie uznane za prawdziwe.

Z tego powodu utworzyłem klasę, której używam nazywane ConversionStrategy, która bierze pod uwagę typ źródła i typ docelowy oraz wybiera najbardziej idealną (i elastyczną) strategię konwersji do przeprowadzenia konwersji.

+2

Przyjęta odpowiedź brzmi sympatycznie w teorii, ale kiedy widzisz takie rzeczy, to naprawdę nie ma racjonalizacji, która mogłaby uczynić to ma sens. – Kyle

3

Co powiesz na to?

byte i = 1; //or 0 
    bool myBool = BitConverter.ToBoolean(new byte[] { i }, 0) 
16

Wspólna FormatHelper klasy poniżej stanowi proste rozwiązanie, za pomocą dwóch odmian przeciążonej metody zwanej StringToBoolean.

FormatHelper.StringToBoolean(String value) 
FormatHelper.StringToBoolean(String value, Boolean NullOrEmptyDefault) 

Oba warianty stanowią przypadek-insentive ciągu dopasowanie

1) normalne konwersja z łańcucha wartościach logicznych zalegających pustych lub zerowe ciągi false

poniższych przykładach prowadzić wartość boolean wartość false: -

Boolean myBool = FormatHelper.StringToBoolean(""); 
Boolean myBool = FormatHelper.StringToBoolean("0"); 
Boolean myBool = FormatHelper.StringToBoolean("false"); 
Boolean myBool = FormatHelper.StringToBoolean("False"); 
Boolean myBool = FormatHelper.StringToBoolean("no"); 
Boolean myBool = FormatHelper.StringToBoolean("off"); 

Wszystkie inne wartości łańcuchowe spowoduje wartości Boolean z true takich jak: -

Boolean myBool = FormatHelper.StringToBoolean("1"); 
Boolean myBool = FormatHelper.StringToBoolean("true"); 
Boolean myBool = FormatHelper.StringToBoolean("True"); 
Boolean myBool = FormatHelper.StringToBoolean("yes"); 
Boolean myBool = FormatHelper.StringToBoolean("xyz blah"); 

Uwaga: Edycja wartości BooleanStringOff w klasie poniżej zawierać więcej (lub mniej) wartości false/off

2) Stosuje takie same zasady jak 1) powyżej, ale umożliwia podanie wartości domyślnej true jako drugiego argumentu konwersji.

Wartość domyślna jest używana, gdy wartość String jest pusta lub null. Jest to przydatne, jeśli brakująca wartość ciągu musi oznaczać stan true.

poniższym przykładzie powróci true

Boolean myBool = FormatHelper.StringToBoolean("",true); 

Poniższy przykład kod zwróci false

Boolean myBool = FormatHelper.StringToBoolean("false",true); 

To Kod klasy

public class FormatHelper 
{ 
    public static Boolean StringToBoolean(String str) 
    { 
     return StringToBoolean(str, false); 
    } 

    public static Boolean StringToBoolean(String str, Boolean bDefault) 
    { 
     String[] BooleanStringOff = { "0", "off", "no" }; 

     if (String.IsNullOrEmpty(str)) 
      return bDefault; 
     else if(BooleanStringOff.Contains(str,StringComparer.InvariantCultureIgnoreCase)) 
      return false; 

     Boolean result; 
     if (!Boolean.TryParse(str, out result)) 
      result = true; 

     return result; 
    } 
} 
Powiązane problemy