[C#] Double.TryParse oder Convert.ToDouble - was ist schneller und sicherer?



Answers

double.Parse würde ich double.Parse anstatt Convert.ToDouble an erster Stelle verwenden.

Ob Sie Parse oder TryParse : TryParse Sie fortfahren, wenn es schlechte Eingabedaten gibt, oder ist das eine wirklich außergewöhnliche Bedingung? Wenn es außergewöhnlich ist, benutze Parse und lass es explodieren, wenn die Eingabe schlecht ist. Wenn es erwartet wird und sauber gehandhabt werden kann, verwenden Sie TryParse .

Question

Meine Anwendung liest eine Excel-Datei mit VSTO und fügt die gelesenen Daten zu einem StringDictionary . Es fügt nur Daten hinzu, die Zahlen mit ein paar Ziffern sind (1000 1000,2 1000,34 - Komma ist ein Trennzeichen in russischen Standards).

Was ist besser zu überprüfen, ob die aktuelle Zeichenfolge eine geeignete Zahl ist?

object data, string key; // data had read

try
{
  Convert.ToDouble(regionData, CultureInfo.CurrentCulture);
  dic.Add(key, regionData.ToString());
}
catch (InvalidCastException)
{
  // is not a number
}

oder

double d;
string str = data.ToString();
if (Double.TryParse(str, out d)) // if done, then is a number
{
  dic.Add(key, str);
}

Ich muss StringDictionary anstelle von Dictionary<string, double> wegen der folgenden Parsing-Algorithmusprobleme verwenden.

Meine Fragen: Welcher Weg ist schneller? Was ist sicherer?

Und ist es besser, Convert.ToDouble(object) oder Convert.ToDouble(string) ?




Die Entwurfsrichtlinien für .NET Framework empfehlen die Verwendung der Try-Methoden. Das Vermeiden von Ausnahmen ist normalerweise eine gute Idee.

Convert.ToDouble(object) wird ((IConvertible) object).ToDouble(null);

Das wird Convert.ToDouble(string, null)

So ist es schneller, die String-Version aufzurufen.

Die String-Version tut dies jedoch nur:

if (value == null)
{
    return 0.0;
}
return double.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, provider);

Es ist also schneller, das double.Parse .




Persönlich finde ich die TryParse Methode leichter zu lesen, welche Sie tatsächlich verwenden möchten, hängt von Ihrem Anwendungsfall ab: Wenn Fehler lokal behandelt werden können, erwarten Sie Fehler und ein bool von TryParse ist gut, sonst könnten Sie wollen lass die Ausnahmen einfach fliegen.

Ich würde erwarten, dass das TryParse auch schneller sein wird, da es den Overhead der Ausnahmebehandlung vermeidet. Aber nutzen Sie ein Benchmark-Tool wie Jon Skeets MiniBench , um die verschiedenen Möglichkeiten zu vergleichen.




Double.TryParse IMO.

Es ist einfacher für Sie zu handhaben, Sie werden genau wissen, wo der Fehler aufgetreten ist.

Dann können Sie damit umgehen, wie Sie es für richtig halten, wenn es falsch zurückgibt (dh konnte nicht konvertieren).




Ich versuche generell, die Convert Klasse zu vermeiden (das heißt: ich benutze sie nicht), weil ich es sehr verwirrend finde: Der Code gibt zu wenig Hinweise darauf, was genau hier passiert, da Convert eine Menge semantisch sehr unterschiedlicher Konvertierungen mit der gleicher Code Dies macht es für den Programmierer schwierig zu kontrollieren, was genau passiert.

Mein Rat lautet daher, diese Klasse niemals zu verwenden. Es ist auch nicht wirklich notwendig (außer für die binäre Formatierung einer Zahl, da die normale ToString Methode der ToString keine geeignete Methode dafür bietet).




Links