我将值存储为DataTable
中的字符串,其中每个值可以真正代表int
,double
或string
(它们都在转换为字符串时从外部数据源导入进程)。我需要测试并查看每个值的实际类型。
什么对应用程序更有效(或没有实际差异)?
int
(然后double
)。如果转换有效,则返回true
。如果抛出异常,请返回false
。int
或double
答案 0 :(得分:9)
会使用double.TryParse,它具有性能优势。
答案 1 :(得分:6)
我想说,不要太担心这种微观表现。最好只是让一些东西工作,然后使它尽可能清晰,简洁和易读。你可以做的最糟糕的事情就是牺牲可读性而获得微不足道的性能。
最后,处理性能问题的最佳方法是在有数据表明存在实际性能问题时保存它们...否则您将花费大量时间进行微优化并实际导致更高以后的维护费用。
如果您发现这种解析情况确实是您应用程序的瓶颈,那么现在是时候尝试找出解决问题的最快方法了。我认为杰夫(以及其他许多人)已经在博客上发表了很多这样的事情。
答案 2 :(得分:5)
根据您是否使用优化进行编译,您将获得不同方法的不同结果。你基本上有几个选择:
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时测试,当它是其他的时候测试)。
如果对象确实持有int,则try-catch
方法是最快的,如果没有,则{| 1}}方法最慢(甚至比GetType
慢)。如果你有一个字符串,int.TryParse
非常快,但如果你有一个未知的对象,它就会变慢。
有趣的是,当.Net 3.5和优化开启时,o is int
检查与try-catch
同时实际是一个int。如果o实际上是其他东西,o is int
只会稍慢。
令人讨厌的是,如果你做了类似的话,FxCop会发出警告:
if( o is int )
int j = (int) o;
但我认为这是FxCop中的一个错误 - 它不知道int是一种值类型,建议您改用o as int
。
如果您的输入始终是字符串int.TryParse
最好,否则is
运算符最快。
当你有一个字符串时,我会看看你是否需要知道它是一个int而不是一个double。如果int.TryParse
通过,那么double.TryParse
也会这样,所以你可以将支票数量的一半 - 返回双倍或字符串,并在你期望一个int时将双打。“
答案 3 :(得分:5)
您遇到的麻烦是,可能会出现答案可能都是三种类型的情况。
3可以是int,double或字符串!
这取决于你想要做什么以及它们是一种特殊类型的重要性。最好只留下它们,只要你可以,或者,有一些方法来标记每一个(如果你能控制原始字符串的来源)。
答案 4 :(得分:3)
我个人使用int.tryparse,然后是double.tryparse。这些方法的表现非常快。它们都返回一个布尔值。如果两者都失败,那么根据您定义数据的方式,您就有了一个字符串。