Вы получите разные результаты для разных методов в зависимости от того, используете ли вы оптимизацию. У вас есть несколько вариантов:
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 )
Вы можете легко настроить консольное приложение, которое будет пытаться выполнить каждое из этих 10 000 раз и возвращать длительности для каждого (проверьте, когда o является целым числом, а когда - чем-то другим).
Метод try-catch
является самым быстрым, если объект действительно содержит int, и самым медленным, если он не имеет (даже медленнее, чем GetType
). int.TryParse
довольно быстро, если у вас есть строка, но если у вас есть неизвестный объект, он медленнее.
Интересно, что с включенным .Net 3.5 и оптимизацией проверка o is int
занимает то же время, что и try-catch
, когда o на самом деле является целым числом. o is int
только немного медленнее, если o на самом деле является чем-то другим.
Раздражительно, FxCop выдает предупреждения, если вы делаете что-то вроде:
if( o is int )
int j = (int) o;
Но я думаю, что это ошибка в FxCop - он не знает, что int является типом значения, и рекомендует вам использовать o as int
.
Если ваш ввод всегда является строкой, int.TryParse
лучше всего, в противном случае оператор is
самый быстрый.
Поскольку у вас есть строка, я бы посмотрел, нужно ли вам знать, что это int, а не double. Если int.TryParse
пройдет, то так же будет double.TryParse
, чтобы вы могли вдвое сократить количество проверок - верните либо double, либо string и сложите двойные числа, когда вы ожидаете int.