我正在使用反射创建一些对象。我正在设置的值是从文件读入的,因此它们本身是字符串格式,我需要将它们转换为属性的数据类型。
我的问题是,使用哪种更快/更好:Convert.ToX(...)
方法还是X.Parse(...)
方法?
答案 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);
}
所有其他数字转换方法都是一样的,包括Decimal
和DateTime
。所以你使用哪一个是相当无关紧要的;在任何一种情况下,结果(和速度)都是相同的。
真的,唯一的区别是开头的if (value == null)
保护条款。这是否方便取决于具体的用例。通常,如果您知道自己有一个非空string
对象,那么您也可以使用Parse
。如果你不确定,ConvertToX
是一个更安全的赌注,请求更少的内联空值检查代码。
答案 1 :(得分:1)
他们完全一样! Convert.ToX(String)
方法实际上调用X.Parse(String)
方法。
答案 2 :(得分:1)
根据我在Reflector中看到的,转换表单字符串是Parse的包装器。所以按理说使用解析在性能方面稍微好一些。
编辑:在Cody指出优化将几乎没有任何差别之后,我在我的机器上进行了测试,并且在解析100万个inetgers时,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();
}
答案 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似乎更有效。但是在您的场景中可能会有所不同,我想您应该进行类似的测试。