当前位置:  开发笔记 > 编程语言 > 正文

Double.TryParse或Convert.ToDouble - 哪个更快更安全?

如何解决《Double.TryParse或Convert.ToDouble-哪个更快更安全?》经验,为你挑选了6个好方法。

我的应用程序使用VSTO读取Excel文件并将读取的数据添加到StringDictionary.它仅添加具有几位数字的数据(1000 1000,2 1000,34 - 逗号是俄罗斯标准中的分隔符).

最好检查当前字符串是否是合适的数字?

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因为以下解析算法问题.

我的问题:哪种方式更快?哪个更安全?

打电话Convert.ToDouble(object)或者打电话会更好Convert.ToDouble(string)吗?



1> Szymon Rozga..:

我在发布模式下做了一个快速的非科学测试.我在两种方法中使用了两个输入:"2.34523"和"badinput",迭代次数为1,000,000次.

有效输入:

Double.TryParse = 646ms
Convert.ToDouble = 662 ms

正如所料,没有太大的不同.对于所有意图和目的,对于有效输入,这些是相同的.

输入无效:

Double.TryParse = 612ms
Convert.ToDouble = ..

嗯..它运行了很长时间.我使用1000次迭代重新编写了整个内容Convert.ToDouble,输入错误需要8.3秒.将其平均化,需要2个多小时.在输入无效的情况下,我不在乎测试的基本程度如何Convert.ToDouble异常提升会破坏你的表现.

所以,这是另一个投票支持TryParse一些数字支持它.


除了上面提到的事情之外,我刚刚发现Convert.ToDouble()将使用科学记数法引发数字异常.考虑一下:double toDouble = Convert.ToDouble(( - 1/30000).ToString()); //将失败double double dblParse = Double.Parse(( - 1/30000).ToString()); // 工作良好

2> Jon Skeet..:

首先,我会使用double.Parse而不是Convert.ToDouble首先使用.

至于你是否应该使用ParseTryParse:如果输入数据不好,你能继续进行,还是这是一个非常特殊的条件?如果它是特殊的,使用Parse并在输入不良时让它爆炸.如果它是预期的并且可以干净地处理,请使用TryParse.


@dnorthut:基本上我很少想要将null转换为0(Convert.ToDouble的转换).它通常也更灵活.我只是倾向于采用具体方法......
乔恩,你能详细说明为什么你喜欢double.Parse over Convert.ToDouble?

3> Jeff Moser..:

.NET Framework设计指南建议使用Try方法.避免异常通常是个好主意.

Convert.ToDouble(object) 会做 ((IConvertible) object).ToDouble(null);

哪个会打电话 Convert.ToDouble(string, null)

所以调用字符串版本会更快.

但是,字符串版本只是这样做:

if (value == null)
{
    return 0.0;
}
return double.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, provider);

所以double.Parse直接做这件事会更快.



4> Aaron Palmer..:

如果您不打算处理异常,请使用TryParse.TryParse更快,因为它不必处理整个异常堆栈跟踪.



5> Konrad Rudol..:

我一般都试图避免使用Convert类(意思是:我不使用它),因为我发现它非常令人困惑:代码提供的关于这里究竟发生了什么的提示太少,因为Convert允许使用相同的代码进行大量语义上非常不同的转换.这使得很难控制程序员究竟发生了什么.

因此,我的建议是永远不要使用这门课程.它也不是必需的(除了数字的二进制格式化,因为ToString数字类的常规方法不提供适当的方法来执行此操作).



6> Chase..:

除非你100%确定你的输入,这种情况很少,你应该使用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.

抛出异常时,解析的速度变为次要因为没有比异常慢得多的速度.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有