Sie erhalten unterschiedliche Ergebnisse für die verschiedenen Methoden, je nachdem, ob Sie mit Optimierungen kompilieren. Sie haben im Grunde ein paar Optionen:
object o;
//checking with is
o is int
//check type
o.GetType() != typeof(int)
//cast and catch exception
try{ int j = (int) o; }
catch {}
//use the tryparse
int.TryParse(Convert.ToString(o), out j)
Sie einfach eine Konsole-Anwendung, die jedes dieser 10.000-mal versucht und gibt Dauern für jeden einrichten kann (Test, wenn o ein int ist und wenn es etwas anderes).
Die Methode try-catch
ist am schnellsten, wenn das Objekt einen int enthält, und bei weitem die langsamste, wenn nicht (sogar langsamer als GetType
). int.TryParse
ist ziemlich schnell, wenn Sie eine Zeichenfolge haben, aber wenn Sie ein unbekanntes Objekt haben, ist es langsamer.
Interessanterweise, mit .Net 3.5 und Optimierungen eingeschaltet die o is int
Prüfung dauert die gleiche Zeit wie try-catch
, wenn o tatsächlich ein int ist. o is int
ist nur etwas langsamer, wenn o eigentlich etwas anderes ist.
Ärgerlicher wird FxCop auf Warnungen aus, wenn Sie so etwas tun:
if(o is int)
int j = (int) o;
Aber ich denke, dass ein Fehler in FxCop ist - es nicht weiß, int ein Werttyp und empfiehlt o as int
stattdessen zu verwenden.
Wenn Ihre Eingabe immer eine Zeichenfolge int.TryParse
ist, ist am besten, is
Operator ist am schnellsten.
Da Sie eine Zeichenfolge haben, würde ich sehen, ob Sie wissen müssen, dass es ein Int ist, anstatt ein Doppel. Wenn int.TryParse
geht dann wird auch so double.TryParse
so können Sie die Hälfte der Anzahl der Schecks - zurückgeben, entweder Double oder String und Boden die Doppelgänger, wenn Sie eine int erwarten.
Das ultimative Ziel war es, den exklusivsten Datentyp für das Objekt zu ermitteln. 3 wäre ein Int. 3.5 wäre ein Doppel. "Drei" wäre eine Zeichenfolge. Ich stellte schließlich eine Funktion zusammen, die eine Menge von object.TryParse-Aufrufen ausprobierte, bis sie herausfinden konnte, was der "am besten passende" Datentyp war. –