我正在使用反射来创建一些对象。我设置的值是从文件中读入的,因此它们本身就是字符串格式,我需要将它们转换为属性的数据类型。
我的问题是,使用Convert.ToX(...)方法和X.Parse(...)方法哪个更快/更好?
发布于 2011-05-12 22:31:02
所有接受string类型参数的Convert.ToX函数最终都会向下调用适当数据类型的Parse方法。
例如,Convert.ToInt32(string)看起来像这样:
public static int ToInt32(string value)
{
if (value == null)
{
return 0;
}
return int.Parse(value, CultureInfo.CurrentCulture);
}对于包括Decimal和DateTime在内的所有其他数字转换方法也是如此。所以你使用哪一个是相当无关紧要的;结果(和速度)在任何一种情况下都是一样的。
实际上,唯一的区别是开头的if (value == null) guard子句。这是否方便取决于具体的用例。通常,如果您知道您有一个非空的string对象,那么您最好使用Parse。如果你不确定,ConvertToX是一个更安全的选择,它只需要较少的内联空检查代码。
发布于 2011-05-12 22:31:14
它们是完全一样的!Convert.ToX(String)方法实际调用X.Parse(String)方法。
发布于 2011-05-12 22:32:26
根据我在Reflector中看到的,Convert form string是一个围绕Parse的包装器。因此,使用解析器在性能上略胜一筹是理所当然的。
编辑:在科迪指出优化几乎不会造成任何不同之后,我在我的机器上进行了测试,实际上,在一个循环中解析一百万个inetger时,Parse和Convert的执行时间是相同的。
EDIT2:给你yas4891,它实际上是你使用的代码,只做了很小的改动。
public static void Main()
{
int tRuns = 1000000;
List<String> tList = new List<string>();
for (int i = 0; i < tRuns; i++) tList.Add(i.ToString());
Stopwatch s = new Stopwatch();
s.Start();
int tSum = 0;
for (int i = tRuns - 1; i >= 0; i--)
{
tSum += Convert.ToInt32(tList[i]);
}
s.Stop();
Console.WriteLine("convert: " + s.ElapsedMilliseconds);
Console.WriteLine("tSum:" + tSum);
s.Reset();
s.Start();
tSum = 0;
for (int i = tRuns - 1; i >= 0; i--)
{
tSum += Int32.Parse(tList[i]);
}
s.Stop();
Console.WriteLine("parse: " + s.ElapsedMilliseconds);
Console.WriteLine("tSum:" + tSum);
Console.ReadKey();
}https://stackoverflow.com/questions/5979420
复制相似问题