根据您是否使用优化进行编译,不同的方法会得到不同的结果。你基本上有几个选择:
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 何时为 int 以及何时为其他值)。
try-catch 方法在对象确实持有 int 时最快,如果不持有 int,则迄今为止最慢(甚至比 GetType 慢)。 int.TryParse 如果你有一个字符串会很快,但如果你有一个未知的对象它会更慢。
有趣的是,在 .Net 3.5 和优化打开的情况下,o is int 检查与 try-catch 花费的时间相同,而 o 实际上是一个 int。 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 也会通过,因此您可以减少一半的检查次数 - 返回双精度或字符串,并在您期望一个 int 时对双精度进行下限。