Obtendrá diferentes resultados para los diferentes métodos dependiendo de si compila con optimizaciones en. Es, básicamente, tiene algunas opciones:
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)
Puede configurar fácilmente una aplicación de consola que trata cada uno de estos 10.000 veces y devuelve duraciones para cada (prueba cuando o es un entero y cuando es el algo más).
El método try-catch
es el más rápido si el objeto contiene un int, y de lejos el más lento si no lo tiene (incluso más lento que GetType
). int.TryParse
es bastante rápido si tiene una cadena, pero si tiene un objeto desconocido es más lento.
Curiosamente, con .Net 3.5 y las optimizaciones activadas, la comprobación o is int
lleva el mismo tiempo que try-catch
cuando o en realidad es una int. o is int
es solo un poco más lento si o realmente es otra cosa.
Irritantemente FxCop se rasguen las advertencias si haces algo como:
if(o is int)
int j = (int) o;
Pero creo que es un error en FxCop - que no sabe int es un tipo de valor y recomienda su uso o as int
lugar.
Si su entrada es siempre una cadena int.TryParse
es lo mejor, de lo contrario, el operador is
es el más rápido.
Como tiene una cadena, miraría si necesita saber que es una int, en lugar de un doble. Si pasa int.TryParse
, también lo hará double.TryParse
, por lo que podría obtenerse la mitad del número de comprobaciones - devuelva el doble o la cadena y el doble cuando espera una int.
El objetivo final era tratar de determinar el tipo de datos más exclusivo para el objeto. 3 sería un int. 3.5 sería un doble. "Tres" sería una cadena. Eventualmente, armé una función que probó un montón de objetos. Intentó llamar hasta que pudiera determinar cuál era el tipo de datos "mejor ajustado". –