改善C#程序的方法-(2)使用TryParse

打印 上一主题 下一主题

主题 834|帖子 834|积分 2502

一 使用TryParse,而不是Parse

除string外的所有基元类型,都有两个将string类型转型为其本身类型的方法:Parse 和 TryParse。
以double类型为例,这两个方法最简单的原型为:
  1. public static Double Parse(string s);
  2. public static bool TryParse(string s, out Double result);
复制代码
两者最大的区别是:如果字符串不满足转换的要求,Parse方法将引发一个异常。TryParse方法不会引发异常,它会返回false,同时将result置为0。
调用Parse方法,如果转型失败,则要将值设定为一个初始值,同时必须要捕获异常:
  1. var str = string.Empty;
  2. double d;
  3. try
  4. {
  5.     d = double.Parse(str);
  6. }
  7. catch (Exception ex)
  8. {
  9.     d = 0;
  10. }
复制代码
而引发异常这个过程会对性能造成损耗。
从 .Net 2.0 开始,FCL开始对基元类型提供TryParse方法。
下例对Parse和TryParse做个实验对比:
  1. double result;
  2. var sw = Stopwatch.StartNew();
  3. for (int i = 0; i < 1000; i++)
  4. {
  5.     try
  6.     {
  7.         result = double.Parse("123");
  8.     }
  9.     catch
  10.     {
  11.         result = 0;
  12.     }
  13. }
  14. sw.Stop();
  15. Console.WriteLine($"Parse Success,  {sw.ElapsedTicks} ticks");
  16. sw = Stopwatch.StartNew();
  17. for (int i = 0; i < 1000; i++)
  18. {
  19.     if (double.TryParse("123", out result) == false)
  20.     {
  21.         result = 0;
  22.     }
  23. }
  24. sw.Stop();
  25. Console.WriteLine($"TryParse Success,   {sw.ElapsedTicks} ticks");
  26. sw = Stopwatch.StartNew();
  27. for (int i = 0; i < 1000; i++)
  28. {
  29.     try
  30.     {
  31.         result = double.Parse("abc");
  32.     }
  33.     catch
  34.     {
  35.         result = 0;
  36.     }
  37. }
  38. sw.Stop();
  39. Console.WriteLine($"Parse Failed,   {sw.ElapsedTicks} ticks");
  40. sw = Stopwatch.StartNew();
  41. for (int i = 0; i < 1000; i++)
  42. {
  43.     if (double.TryParse("abc", out result) == false)
  44.     {
  45.         result = 0;
  46.     }
  47. }
  48. sw.Stop();
  49. Console.WriteLine($"TryParse Failed,    {sw.ElapsedTicks} ticks");
复制代码
输出:
Parse Success, 3663 ticks
TryParse Success,   910 ticks
Parse Failed,   13685860 ticks
TryParse Failed,    716 ticks
可见,TryParse的执行效率高于Parse。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表