Jaka jest różnica między Convert.ToBoolean (string) i Boolean.Parse (string)?

80

Jaka jest różnica między tymi dwiema metodami

Convert.ToBoolean()

i

Boolean.Parse()?

Czy jest jakiś powód, aby używać jednego lub drugiego?

Czy są też inne type.Parse()metody, na które powinienem uważać?

Dzięki,

Matt

mbrownnyc
źródło

Odpowiedzi:

79

Convert.ToBoolean(string)w rzeczywistości i bool.Parse()tak wywołuje , więc dla strings niezerowych nie ma różnicy funkcjonalnej. (W przypadku null strings Convert.ToBoolean()zwraca false, podczas gdy bool.Parse()zgłasza ArgumentNullException.)

Biorąc pod uwagę ten fakt, powinieneś używać, bool.Parse()gdy jesteś pewien, że twoje dane wejściowe nie są zerowe, ponieważ oszczędzasz sobie jedną kontrolę zerową.

Convert.ToBoolean()oczywiście ma szereg innych przeciążeń, które pozwalają wygenerować a boolz wielu innych wbudowanych typów, podczas gdy Parse()jest stringto tylko dla s.

Jeśli chodzi o metody type.Parse (), na które powinieneś zwrócić uwagę, wszystkie wbudowane typy liczbowe mają Parse()również TryParse()metody. DateTimema te, a także dodatkowe ParseExact()/ TryParseExact()metody, które pozwalają określić oczekiwany format daty.

dlev
źródło
Dzięki za szczegóły. Tak więc nie ma różnicy w wydajności między nimi, czy też można powiedzieć, że przy użyciu Boolean.Parse (string) są bardzo małe zyski?
mbrownnyc
1
@mbrownnyc Możesz uzyskać bardzo niewielki (prawdopodobnie niezauważalny) zysk, używając, Parse() jeśli masz pewność, że dane wejściowe nie są ciągiem zerowym . Jeśli nie jesteś pewien, po prostu użyj ToBoolean(), ponieważ zrobi to za Ciebie. A jeśli nie chcesz, aby pusty łańcuch skutkował fałszem, wykonaj sprawdzenie samodzielnie, a następnie wywołaj, Parse()jeśli nie jest pusty.
dlev
34

Oto krótkie demo:

object ex1 = "True";
Console.WriteLine(Convert.ToBoolean(ex1)); // True
Console.WriteLine(bool.Parse(ex1.ToString())); // True

object ex2 = "true";
Console.WriteLine(Convert.ToBoolean(ex2)); // True
Console.WriteLine(bool.Parse(ex2.ToString())); // True

object ex3 = 1;
Console.WriteLine(Convert.ToBoolean(ex3)); // True
Console.WriteLine(bool.Parse(ex3.ToString())); // Unhandled Exception: System.FormatException

object ex3 = "1";
Console.WriteLine(Convert.ToBoolean(ex3)); // An unhandled exception of type 'System.FormatException' occurred
Console.WriteLine(bool.Parse(ex3.ToString())); // Unhandled Exception: System.FormatException

object ex4 = "False";
Console.WriteLine(Convert.ToBoolean(ex4)); // False
Console.WriteLine(bool.Parse(ex4.ToString())); // False

object ex5 = "false";
Console.WriteLine(Convert.ToBoolean(ex5)); // False
Console.WriteLine(bool.Parse(ex5.ToString())); // False

object ex6 = 0;
Console.WriteLine(Convert.ToBoolean(ex6)); // False
Console.WriteLine(bool.Parse(ex6.ToString())); // Unhandled Exception: System.FormatException

object ex7 = null;
Console.WriteLine(Convert.ToBoolean(ex7)); // False
Console.WriteLine(bool.Parse(ex7.ToString())); // Unhandled Exception: System.NullReferenceException

Uwaga: istnieją również dwie właściwości boolTrueString i FalseString, ale bądź ostrożny, ponieważ bool.TrueString != "true"tylkobool.TrueString == "True"

Console.WriteLine(bool.TrueString); // True
Console.WriteLine(bool.FalseString); // False
Sergey Malyutin
źródło
2
Convert.ToBoolean("1"); // Format Exception
Robert McKee
3

Boolean.Parse()zamieni ciąg znaków reprezentujący logiczną wartość boolowską na wartość logiczną. Convert.ToBoolean()ma wiele przeciążeń , które konwertują typy pierwotne na ich logiczne odpowiedniki.

Większość typów pierwotnych w języku C #, jeśli nie wszystkie, ma skojarzoną metodę * .Parse / Convert.To *, która służy do tego samego celu, co Boolean.Parse()/Convert.ToBoolean().

csano
źródło