Mees doeltreffende manier om Object Tipe Toets
Vra
Ek het waardes gestoor as snare in 'n DataTable
waar elke waarde werklik 'n int
, double
, of string
kan verteenwoordig (hulle is almal tot bekering te snare tydens 'n invoer proses van 'n eksterne data bron). Ek nodig het om te toets en sien watter soort elke waarde werklik is.
Wat is meer doeltreffend vir die aansoek (of is daar geen praktiese verskil)?
- Probeer om te skakel na
int
(en dandouble
). As omskakeling werke, die terugkeertrue
. As 'n uitsondering is gegooi, terugkeerfalse
. - Gereelde uitdrukkings wat ontwerp is om die patroon van 'n
int
ofdouble
pas - 'n ander metode?
Oplossing
Sou double.TryParse gebruik, dit het prestasie voordele.
Ander wenke
Ek sou sê, nie soseer oor sulke mikro prestasie bekommerd wees nie. Dit is baie beter om net te kry iets om te werk, en dan maak dit so duidelik en bondig en maklik as moontlik te lees. Die ergste ding wat jy kan doen is offer leesbaarheid vir 'n onbeduidende bedrag van prestasie.
In die einde, die beste manier om te gaan met prestasie kwessies is om hulle te red vir wanneer jy data wat dui daar is 'n werklike prestasie probleem het ... anders sal jy 'n baie tyd mikro-optimalisering spandeer en eintlik veroorsaak hoër onderhoudskoste vir later op.
As jy hierdie ontleding situasie is regtig die bottelnek in jou aansoek, dan is die tyd om te probeer en uit te vind wat die vinnigste manier om op te los die probleem is. Ek dink Jeff (en baie ander) het blog oor hierdie soort ding baie.
Jy sal verskillende resultate vir die verskillende metodes te kry, afhangende van of jy stel met optimalisatie op. Jy het basies 'n paar opsies:
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 )
Jy kan maklik die opstel van 'n konsole artikels wat elk van hierdie 10,000 keer probeer en keer terug duur vir elke (toets wanneer o 'n int en wanneer dit is iets anders).
Die try-catch
metode is die vinnigste as die voorwerp doen hou 'n int, en by verre die stadigste as dit nie (selfs stadiger as GetType
). int.TryParse
is redelik vinnig as jy 'n string, maar as jy 'n onbekende voorwerp dis stadiger.
Dit is interessant met Net 3,5 en optimalisatie aangeskakel die o is int
tjek neem dieselfde tyd as try-catch
wanneer o eintlik is 'n int. o is int
is net 'n bietjie stadiger as o eintlik is iets anders.
lastig FxCop sal opgooi waarskuwings as jy so iets te doen:
if( o is int )
int j = (int) o;
Maar ek dink dit is 'n fout in FxCop -. Dit nie weet int is nie 'n waarde tipe en beveel jou om o as int
plaas gebruik
As u insette is altyd 'n string int.TryParse
is die beste, anders sal die is
operateur is vinnigste.
As jy 'n string Ek sal kyk of jy nodig het om te weet dat dit 'n int, eerder as om 'n dubbel. As int.TryParse
gaan dan sal so so double.TryParse
jy kan die helfte van die aantal tjeks -. Terugkeer óf dubbel of string en vloer die dubbelspel wanneer jy 'n int verwag
Die probleem wat jy het, is dat daar situasies kan wees waar die antwoord kan wees al drie tipes.
3 kan 'n int, 'n dubbel of 'n string wees!
Dit hang af van wat jy probeer om te doen en hoe belangrik dit is dat hulle 'n spesifieke tipe. Dit mag dalk die beste wees net om hulle te verlaat as hulle so lank as wat jy kan of, alternatiewelik, 'n paar met 'n metode om elkeen te merk (as jy beheer oor die bron van die oorspronklike string het).
Ek sal persoonlik gebruik int.tryparse, dan double.tryparse. Prestasie op dié metodes is redelik vinnig. Hulle het albei terug 'n Boole. As albei misluk dan moet jy 'n string, per hoe jy jou data gedefinieer.