哪个更好用:Convert.ToX或X.Parse(...)?

时间:2011-05-12 14:19:48

标签: c# .net performance .net-4.0 type-conversion

我正在使用反射创建一些对象。我正在设置的值是从文件读入的,因此它们本身是字符串格式,我需要将它们转换为属性的数据类型。

我的问题是,使用哪种更快/更好:Convert.ToX(...)方法还是X.Parse(...)方法?

5 个答案:

答案 0 :(得分:11)

所有接受Convert.ToX类型参数的string函数最终都会调用相应数据类型的Parse方法。

例如,Convert.ToInt32(string)看起来像这样:

public static int ToInt32(string value)
{
   if (value == null)
   {
      return 0;
   }
   return int.Parse(value, CultureInfo.CurrentCulture);
}

所有其他数字转换方法都是一样的,包括DecimalDateTime。所以你使用哪一个是相当无关紧要的;在任何一种情况下,结果(和速度)都是相同的。

真的,唯一的区别是开头的if (value == null)保护条款。这是否方便取决于具体的用例。通常,如果您知道自己有一个非空string对象,那么您也可以使用Parse。如果你不确定,ConvertToX是一个更安全的赌注,请求更少的内联空值检查代码。

答案 1 :(得分:1)

他们完全一样! Convert.ToX(String)方法实际上调用X.Parse(String)方法。

答案 2 :(得分:1)

根据我在Reflector中看到的,转换表单字符串是Parse的包装器。所以按理说使用解析在性能方面稍微好一些。

编辑:在Cody指出优化将几乎没有任何差别之后,我在我的机器上进行了测试,并且在解析100万个inetgers时,ParseConvert的执行时间确实相同在循环中。

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();
        }

答案 3 :(得分:1)

另一种可能性是TryParse方法。如果有可能无法成功解析值,则这些特别有用。调用将返回bool,而不是抛出异常,指示操作是否成功。与处理异常相比,这执行得更快,实现更清晰。

答案 4 :(得分:-1)

使用以下代码

int tRuns = 1000000;
List<String> tList = new List<string>();

for (int i = 0; i < tRuns; i++)
   tList.Add(i.ToString());


PerformanceMeter.Start();
int tSum = 0;
for (int i = tRuns-1; i >= 0; i--)
{
   tSum += Convert.ToInt32(tList[i]);
}

PerformanceMeter.LogAndStop("using Convert.ToInt32:");

cLogger.Info("tSum:" + tSum);
PerformanceMeter.Start();

tSum = 0;
for (int i = tRuns-1; i >= 0; i--)
{
   tSum += Int32.Parse(tList[i]);
}

PerformanceMeter.LogAndStop("using Int32.Parse:");
cLogger.Info("tSum:" + tSum);

给我以下输出:

{PerformanceMeter}:178 INFO: - 使用Convert.ToInt32 :: 233,0133 ms
{Program}:92 INFO: - tSum:1783293664
{PerformanceMeter}:178 INFO: - 使用Int32.Parse :: 179,0103 ms
{Program}:102 INFO: - tSum:1783293664

所以至少对于Int32来说,使用Int32.Parse似乎更有效。但是在您的场景中可能会有所不同,我想您应该进行类似的测试。