测试对象类型的最有效方法
我将值存储为字符串,存储在"数据表"中,其中每个值实际上可以表示一个"整数","双精度"或者"字符串"(它们在从外部数据源进行导入过程中都转换为字符串)。我需要测试并查看每个值的真正类型。
什么对应用程序更有效(或者没有实际区别)?
- 尝试转换为" int"(然后转换为" double")。如果转换有效,则返回
true
。如果抛出异常,则返回" false"。 - 正则表达式,旨在匹配" int"或者" double"的模式
- 还有其他方法吗?
解决方案
回答
将使用double.TryParse,它具有性能优势。
回答
我个人使用int.tryparse,然后使用double.tryparse。这些方法的性能相当快。它们都返回一个布尔值。如果两者均失败,则根据定义数据的方式,我们将获得一个字符串。
回答
我会说,不必太担心这种微性能。最好先做一些工作,然后使其尽可能简洁明了且易于阅读。我们能做的最坏的事情是牺牲可读性,而获得的性能却微不足道。
最后,处理性能问题的最佳方法是在有表明实际性能问题的数据时保存它们……否则,我们将花费大量时间进行微优化,并且实际上会导致更高的维护成本。稍后的。
如果我们发现这种解析情况确实是应用程序中的瓶颈,那么该是时候尝试找出解决问题最快的方法了。我认为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 )
我们可以轻松地设置一个控制台应用程序,尝试尝试这10,000次中的每一次并返回每次的持续时间(测试o是int还是其他形式的时间)。
如果对象确实拥有一个int,则try-catch方法是最快的;如果没有,则是最慢的(甚至比GetType还慢)。如果我们有一个字符串,int.TryParse
会很快,但是如果我们有一个未知的对象,它的速度就会变慢。
有趣的是,在.Net 3.5和优化打开的情况下,当o实际上是int时," o is int"检查与" try-catch"花费的时间相同。如果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
也会通过,因此我们可以将检查次数的一半返回double或者string,并在希望有int时将double设置为double。
回答
我们遇到的麻烦是,在某些情况下答案可能是全部三种类型。
3可以是整数,双精度或者字符串!
这取决于我们要尝试做什么以及它们是特定类型的重要性。最好将它们保留尽可能长的时间,或者另辟some径,用一种方法来标记每个字符(如果我们可以控制原始字符串的来源)。