2009-12-14 10 views
55

Perché è stato deciso che durante l'analisi di un booleano, 0/1 non sono accettabili?Convert.ToBoolean e Boolean.Parse non accettano 0 e 1

Quando analizza qualsiasi valore di tipo intero, accetta le stringhe numeriche da analizzare. (E se .NET può analizzare la stringa "Cento milioni duecentosessantacinquemilaottocentosessantacinque" sarei sorpreso).

Cosa rende speciale il booleano? Sono essenzialmente 0 come falso e non zero come vero nella mia esperienza ...

Esiste un metodo bcl per analizzare una stringa come questa, e in caso contrario, perché?

Nota: ho dimenticato di specificare in una stringa "0" e "1". Curioso però che se già un int funziona come ho previsto. Forse questo ha causato la confusione.

risposta

58

0 e (non-zero) non sono uguali a "false" e "vera" , sono solo la rappresentazione scelta da C. Altre lingue usano 0 per true e -1 per false, o altri schemi interamente. Un booleano è non uno 0 o un 1, è un vero o un falso.

Dovrebbe anche gestire "sì" e "no", "off" e "on", e tutta la miriade di altre cose che sono analoghe ai booleani? Dove disegneresti la linea?

+2

Grazie! Questo è quello che stavo cercando, una spiegazione del perché. Se alcune lingue effettivamente usano 0 per vero, e -1 per falso, penso sinceramente che siano incasinate, ma questo è un buon motivo per non assumere automaticamente attraverso un'analisi che alcuni sviluppatori potrebbero usare ciecamente. –

+48

Perché, sì. Sì, dovrebbe gestire sì/no off/on. – WEFX

+2

Per spiegare ulteriormente perché alcune lingue usano 0 per vero e -1 per falso, considera le loro rappresentazioni binarie: '00000000' e' 11111111'. – MCattle

22

Cosa rende speciale il booleano? Sono essenzialmente 0 come falso e non zero come vero nella mia esperienza ...

Questo è un dettaglio di implementazione e non è affatto pertinente.

true è un valore booleano. false è un valore booleano. Tutto il resto non lo è.

Se si vuole analizzare qualcosa in modo tale che la stringa "0" valuta false mentre ogni altra cosa valuta true, è possibile utilizzare:

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

Bella soluzione concisa lì, mi piace come me! – RemarkLima

+6

E la stringa "true" e la stringa "false" sono stringhe, non booleane. Eppure nessuno sembra avere problemi a riconoscerne il significato quando li converte in booleani. Se siamo abbastanza intelligenti da riconoscere che "vero" significa vero, penso che siamo abbastanza intelligenti da riconoscere che "1" e 1 significano anche vero. E siamo abbastanza intelligenti da riconoscere che "on" e "yes" sono affermazioni che possono anche essere tranquillamente convertite in true se il programmatore richiede specificamente una conversione. – Rikaelus

3

Volete Convert.ToBoolean(int value) non sicuro di quello che succede con i metodi Parse :-)

Codice in materia di alcuna utilità:

 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

Sfortunatamente, questo accade molto in .NET. Ad esempio, non riesco a ricordare se si tratta di XML Serializer o XmlConvert, ma uno di essi non riesce se l'involucro di True/False non è corretto.

È possibile effettuare il round trip tramite numero intero per ottenere ciò che si desidera.

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

Nel caso precedente, qualsiasi valore diverso da zero verrà valutato come true.

Per questo motivo, ho creato una classe che uso dappertutto denominata ConversionStrategy che prende in considerazione il tipo di origine e il tipo di destinazione e sceglie la strategia di conversione più ideale (e flessibile) per effettuare la conversione.

+2

La risposta accettata suona bene in teoria, ma quando si vedono cose come questa non c'è davvero alcuna razionalizzazione che possa rendere tutto questo sensato. – Kyle

3

Che ne dici di questo?

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

Il comune FormatHelper classe illustrato di seguito fornisce una soluzione semplice utilizzando due varianti di un metodo di overload chiamato StringToBoolean.

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

Entrambe le varianti prevedono la stringa di corrispondenza insentive caso

1) La conversione normale da stringa in boolean inadempiente stringhe vuote o nulli false

I seguenti esempi provocherà un valore boolean di 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"); 

Tutti gli altri valori di stringa si tradurrà in un valore Boolean di true quali: -

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

Nota: modificare il valore della BooleanStringOff nella classe di seguito per includere i valori più (o meno) per falso in/off

2) segue le stesse regole 1) sopra, ma permette un valore predefinito di true da fornire la 2 argomento della conversione.

Il valore predefinito viene utilizzato quando il valore String è vuoto o null. Ciò è utile se un valore stringa mancante deve indicare uno stato true.

Il seguente esempio di codice restituirà true

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

Il seguente esempio codice di ritorno false

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

Questo è il codice per la classe FormatHelper

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