最有效的测试对象类型的方法

Yaa*_*lis 21 .net c# double int

我将值存储为字符串,DataTable其中每个值实际上可以表示一个int,, doublestring(它们在从外部数据源导入过程中都被转换为字符串).我需要测试并查看每个值的实际类型.

什么对应用程序更有效(或没有实际差异)?

  1. 尝试转换为int(然后double).如果转换有效,则返回true.如果抛出异常,请返回false.
  2. 正则表达式旨在匹配int或的模式double
  3. 其他一些方法?

gil*_*gil 10

会使用double.TryParse,它具有性能优势.


Mik*_*one 6

我会说,不要太担心这种微观表现.最好只是让一些东西工作,然后使它尽可能清晰,简洁和易读.你可以做的最糟糕的事情就是牺牲可读性以获得微不足道的性能.

最后,处理性能问题的最佳方法是在数据显示存在实际性能问题时保存它们...否则您将花费​​大量时间进行微优化,实际上会导致更高的维护成本稍后的.

如果您发现这种解析情况确实是应用程序中的瓶颈,那么现在是时候尝试找出解决问题的最快方法了.我认为Jeff(以及其他许多人)已经在博客上发表了很多关于此类事情的文章.


Kei*_*ith 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 )
Run Code Online (Sandbox Code Playgroud)

您可以轻松设置一个控制台应用程序,该应用程序尝试每次10,000次,并为每个应用程序返回持续时间(当o为int时测试,何时为其他测试).

try-catch如果对象确实持有int,则该方法最快,如果不存在,则该方法最慢(甚至更慢GetType). int.TryParse如果你有一个字符串很快,但如果你有一个未知的对象,它会更慢.

有趣的是,在启用.Net 3.5和优化的情况下,o is int检查与try-catcho实际上是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!

这取决于你想要做什么以及它们是一种特殊类型的重要性.可能最好只要你可以保留它们,或者,有一些方法来标记每一个(如果你能控制原始字符串的来源).