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

至于是否应该使用ParseTryParse :如果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来比较各种可能性。