2009-12-14 6 views
55

Warum wurde entschieden, dass 0/1 beim Analysieren eines booleschen Wertes nicht akzeptabel ist?Convert.ToBoolean und Boolean.Parse akzeptieren nicht 0 und 1

Beim Analysieren eines Werts vom Typ Ganzzahl akzeptiert es numerische Zeichenfolgen, die analysiert werden sollen. (Und wenn .NET die Zeichenfolge "Einhundert Millionen zweihundertfünfundsechzigtausendachthundertfünfundsechzig" parsen kann, würde ich überrascht sein).

Was macht Booleans besonders? Sie sind im Wesentlichen 0 als falsch, und nicht Null als wahr in meiner Erfahrung ...

Gibt es eine Bcl-Methode, um eine Zeichenfolge wie folgt zu analysieren, und wenn nicht, warum?

Hinweis: Ich habe vergessen, in einer Zeichenfolge "0" und "1" anzugeben. Seltsam, dass, wenn es schon int ist, es so funktioniert, wie ich es erwartet habe. Vielleicht hat das die Verwirrung verursacht.

Antwort

58

0 und (nicht-Null) ist nicht gleich "false" und "true" Sie sind nur die von C. gewählte Repräsentation. Andere Sprachen verwenden 0 für wahr und -1 für falsch oder andere Schemata vollständig. Ein boolescher Wert ist nicht eine 0 oder eine 1, es ist eine wahre oder eine falsche.

Sollte es auch "Ja" und "Nein", "Aus" und "Ein", und all die vielen anderen Dinge, die Booleans analog sind? Wo würdest du die Grenze ziehen?

+2

Danke! Das ist, was ich suchte, eine Erklärung warum. Wenn einige Sprachen in der Tat 0 für wahr, und -1 für falsch verwenden, denke ich ehrlich, sie sind vermasselt, aber das ist ein guter Grund, nicht automatisch durch eine Analyse anzunehmen, dass einige Entwickler blind verwenden können. –

+48

Warum, ja. Ja, es sollte ja/nein aus/angehen. – WEFX

+2

Um zu erklären, warum einige Sprachen 0 für wahr und -1 für falsch verwenden, betrachten Sie ihre binären Darstellungen: '00000000' und' 11111111'. – MCattle

22

Was macht Booleans besonders? Sie sind im Wesentlichen 0 als falsch, und nicht Null als wahr in meiner Erfahrung ...

Das ist ein Implementierungsdetail und ist überhaupt nicht relevant.

true ist ein boolescher Wert. false ist ein boolescher Wert. Alles andere ist nicht.

Wenn Sie solche etwas analysieren möchten, dass die Zeichenfolge „0“ bewertet false während alles andere true auswertet, können Sie verwenden:

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

Schöne übersichtliche Lösung, ich mag likey! – RemarkLima

+6

Und der String "True" und der String "False" sind Strings, nicht Booleans. Doch scheint niemand ein Problem damit zu haben, ihre Bedeutung zu erkennen, wenn man sie in Booleans umwandelt. Wenn wir schlau genug sind zu erkennen, dass "wahr" wahr ist, dann denke ich, dass wir schlau genug sind zu erkennen, dass "1" und 1 auch wahr sind. Und wir sind schlau genug zu erkennen, dass "on" und "yes" Affirmationen sind, die auch sicher in true umgewandelt werden können, wenn der Programmierer speziell eine Konvertierung anfordert. – Rikaelus

3

Sie wollen Convert.ToBoolean(int value) nicht sicher, was mit den Parse-Methoden ist bis :-)

-Code für keinen nützlichen Zweck:

 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

Leider passiert dies viel in .NET. Zum Beispiel kann ich mich nicht erinnern, ob es XML Serializer oder XmlConvert ist, aber einer von ihnen schlägt fehl, wenn die Hülle von True/False nicht korrekt ist.

Sie können Rundgang durch Ganzzahl, um zu bekommen, was Sie wollen.

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

Im obigen Fall wird alles, was nicht Null ist, als wahr ausgewertet.

Aus diesem Grund habe ich eine Klasse namens ConversionStrategy erstellt, die den Quellentyp und den Zieltyp berücksichtigt und die ideale (und flexible) Konvertierungsstrategie für die Konvertierung auswählt.

+2

Die angenommene Antwort klingt in der Theorie nett, aber wenn man so etwas sieht, gibt es wirklich keine Rationalisierung, die dies sinnvoll erscheinen lassen könnte. – Kyle

3

Wie wäre es damit?

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

Die gemeinsame FormatHelper Klasse unten bietet eine einfache Lösung unter Verwendung von zwei Varianten einer überladenen Methode aufgerufen StringToBoolean.

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

Beide Varianten bieten eine fall insentive Zeichenfolge Spiel

1) Die normale Umwandlung von String leer oder null Strings false wird

die folgenden Beispiele boolean säumige ergeben a boolean Wert von 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"); 

Alle andere String-Werte werden in einem Boolean Wert von true wie führen: -

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

Hinweis: unter dem Wert von BooleanStringOff in der Klasse bearbeiten mehr (oder weniger) Werte für falsch/off schließen

2) folgt den gleichen Regeln wie 1) oben, jedoch kann ein Standardwert von true als zweite Argument für die Umwandlung geliefert werden.

Der Standardwert wird verwendet, wenn der Wert String leer ist oder null. Dies ist nützlich, wenn ein fehlender Zeichenfolgenwert einen true-Status anzeigen muss.

Das Beispiel folgende Code wird true Rückkehr

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

Das folgende Codebeispiel false

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

Dies ist der Code für die FormatHelper Klasse

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; 
    } 
} 
zurück
Verwandte Themen