我会说,不要太担心这种微观表现.最好只是让一些东西工作,然后使它尽可能清晰,简洁和易读.你可以做的最糟糕的事情就是牺牲可读性以获得微不足道的性能.
最后,处理性能问题的最佳方法是在数据显示存在实际性能问题时保存它们...否则您将花费大量时间进行微优化,实际上会导致更高的维护成本稍后的.
如果您发现这种解析情况确实是应用程序中的瓶颈,那么现在是时候尝试找出解决问题的最快方法了.我认为Jeff(以及其他许多人)已经在博客上发表了很多关于此类事情的文章.
根据您是否使用优化进行编译,您将获得不同方法的不同结果.你基本上有几个选择:
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 )
Run Code Online (Sandbox Code Playgroud)
您可以轻松设置一个控制台应用程序,该应用程序尝试每次10,000次,并为每个应用程序返回持续时间(当o为int时测试,何时为其他测试).
try-catch
如果对象确实持有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;
Run Code Online (Sandbox Code Playgroud)
但我认为这是FxCop中的一个错误 - 它不知道int是一个值类型,建议你o as int
改用.
如果您的输入始终是字符串int.TryParse
是最好的,否则is
操作员是最快的.
当你有一个字符串时,我会看你是否需要知道它是一个int而不是一个double.如果int.TryParse
通过那么那么double.TryParse
你将可以减少支票数量的一半 - 返回双倍或字符串并在你期望一个int时将双打.
小智 5
您遇到的麻烦是,可能存在这样的情况:答案可能都是三种类型.
3可以是int,double或string!
这取决于你想要做什么以及它们是一种特殊类型的重要性.可能最好只要你可以保留它们,或者,有一些方法来标记每一个(如果你能控制原始字符串的来源).