Du får forskjellige resultater for de ulike metoder avhengig av om du kompilere med optimaliseringer på. Du har i utgangspunktet noen alternativer:
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 )
Du kan enkelt sette opp en konsoll app som prøver hver av disse 10.000 ganger og returnerer varigheter for hver (test når o er en int og når det er noe annet).
Den try-catch
metoden er den raskeste hvis objektet er i besittelse av en int, og den aller langsomste hvis den ikke gjør det (enda langsommere enn GetType
). int.TryParse
er ganske rask hvis du har en streng, men hvis du har et ukjent objekt det er tregere.
Interessant, med .Net 3.5 og optimaliseringer slått på o is int
sjekken tar samme tid som try-catch
da o faktisk er en int. o is int
er bare litt saktere hvis o faktisk er noe annet.
Annoyingly FxCop vil kaste opp advarsler hvis du gjør noe sånt som:
if( o is int )
int j = (int) o;
Men jeg tror det er en feil i FxCop - det vet ikke int er en verditype og anbefaler deg å bruke o as int
i stedet.
Hvis dine innspill er alltid en streng int.TryParse
som er best, ellers is
operatøren er raskest.
Som du har en streng vil jeg se på om du trenger å vite at det er en int, i stedet for en dobbel. Hvis int.TryParse
går da så vil double.TryParse
så du kunne halvparten av antall kontroller - returnere enten dobbel eller streng og gulv dobler når du forventer en int.