Double.TryParse或Convert.ToDouble – 哪个更快更安全?
我的应用程序使用VSTO读取Excel文件,并将读取的数据添加到StringDictionary
。 它只添加数字,只有几位数字(1000 1000,2 1000,34 – 逗号是俄罗斯标准中的分隔符)。
有什么更好的检查,如果当前string是一个合适的数字?
object data, string key; // data had read try { Convert.ToDouble(regionData, CultureInfo.CurrentCulture); dic.Add(key, regionData.ToString()); } catch (InvalidCastException) { // is not a number }
要么
double d; string str = data.ToString(); if (Double.TryParse(str, out d)) // if done, then is a number { dic.Add(key, str); }
我必须使用StringDictionary
而不是Dictionary<string, double>
因为下面的parsingalgorithm问题。
我的问题:哪种方式更快? 哪个更安全?
最好调用Convert.ToDouble(object)
或Convert.ToDouble(string)
?
我在Release模式下做了一个非科学testing。 我在两个方法中都使用了两个input:“2.34523”和“badinput”,迭代了1000000次。
有效的input:
Double.TryParse = 646ms Convert.ToDouble = 662 ms
没有太大的不同,正如所料。 对于所有的意图和目的,对于有效的input,这些都是一样的。
input无效:
Double.TryParse = 612ms Convert.ToDouble = ..
那么..它运行了很长时间。 我使用1,000次迭代重新整理了所有内容,而使用错误input的Convert.ToDouble
花费了8.3秒。 平均起来,这将需要2个多小时。 我不关心testing是多么的基础,在无效input的情况下, Convert.ToDouble
的exception提升会破坏你的性能。
所以,这里是TryParse
的另一个投票,用一些数字来备份它。
首先,我会使用double.Parse
而不是Convert.ToDouble
。
至于是否应该使用Parse
或TryParse
:如果input数据不正确,还是可以继续使用,还是非常特殊的情况? 如果是例外情况,请使用Parse
,如果input不正确,就让它炸掉。 如果这是预期的,可以干净地处理,使用TryParse
。
如果你不打算用TryParse处理exception。 TryParse更快,因为它不必处理整个exception堆栈跟踪。
我通常试图避免Convert
类(意思是:我不使用它),因为我觉得它很混乱:代码给了什么在这里发生什么暗示,因为Convert
允许在语义上非常不同的转换发生了很多相同的代码。 这使程序员很难控制到底发生了什么。
因此,我的build议是永远不要使用这个类。 它也不是真的有必要(除了数字的二进制格式,因为数字类的正常的ToString
方法不提供适当的方法来做到这一点)。
除非你是100%确定的input,否则你应该使用Double.TryParse。
Convert.ToDouble will throw an exception on non-numbers Double.Parse will throw an exception on non-numbers or null Double.TryParse will return false or 0 on any of the above without generating an exception.
抛出exception时,parsing速度变为次要,因为速度比exception慢。
.NET Frameworkdevise指南build议使用Try方法。 避免例外通常是一个好主意。
Convert.ToDouble(object)
会做((IConvertible) object).ToDouble(null);
哪个会调用Convert.ToDouble(string, null)
所以调用string版本会更快。
但是,string版本只是这样做的:
if (value == null) { return 0.0; } return double.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, provider);
所以直接执行double.Parse
更快。
很多讨厌的Convert类在这里…为了平衡一点,转换有一个好处 – 如果你交给一个对象,
Convert.ToDouble(o);
如果o已经是一个Double(或者一个int或者任何可以被castable的东西),就可以很容易地返回值。
使用Double.Parse或Double.TryParse是非常好的,如果你已经有一个string,但是
Double.Parse(o.ToString());
必须首先parsingstring,并根据您的input可能会更昂贵。
Double.TryParse IMO。
你更容易处理,你会知道错误发生的地方。
那么你可以处理它,如果你看到适合,如果它返回false(即不能转换)。
我一直倾向于使用TryParse()
方法,因为它将TryParse()
成功或失败转换,而不必担心exception。
就我个人而言,我发现TryParse
方法更容易阅读,你真正想要使用哪一个取决于你的用例:如果错误可以在本地处理,你期待错误, TryParse
的bool是好的,否则你可能想只是让例外飞行。
我希望TryParse
也能更快,因为它避免了exception处理的开销。 但是使用一个基准工具,比如Jon Skeet的MiniBench来比较各种可能性。