建议4: TryParse比Parse好

转载 2016年08月29日 13:31:16

建议4: TryParse比Parse好

如果注意观察除string外的所有基元类型,会发现它们都有两个将字符串转型为本身的方法:Parse和TryParse。以类型double为例,这两个方法最简单的原型为:

  1. 1.public static double Parse(string s)  
  2. 2.public static bool TryParse(string s, out double result) 

两者最大的区别是,如果字符串格式不满足转换的要求,Parse方法将会引发一个异常;TryParse方法则不会引发异常,它会返回false,同时将result置为0。

实际上,早期的FCL中并没有提供TryParse方法,那时只能调用Parse方法,如果转型失败,则要将值设定为一个初始值,同时必须要捕获异常,代码如下所示:

  1. string str = null;  
  2. double d;  
  3. try  
  4. {  
  5.     d = Double.Parse(str);  
  6. }  
  7. catch (Exception ex)  
  8. {  
  9.     d = 0;  

要注意,引发异常这个过程会对性能造成损耗(第5章会详细解释这一点)。微软的开发团队正是注意到这一点,所以从.NET 2.0开始,FCL中开始为基元类型提供TryParse方法。我们不妨来做个实验,代码如下所示:

  1. double re;  
  2. long ticks;  
  3.  
  4. Stopwatch sw = Stopwatch.StartNew();  
  5. for (int i = 1; i < 1000; i++)  
  6. {  
  7.     try  
  8.     {  
  9.         re = double.Parse("123");  
  10.     }  
  11.     catch  
  12.     {  
  13.         re = 0;  
  14.     }  
  15. }  
  16. sw.Stop();  
  17. ticks = sw.ElapsedTicks;  
  18. Console.WriteLine("double.Parse() 成功,{0} ticks", ticks);  
  19.  
  20. sw = Stopwatch.StartNew();  
  21. for (int i = 1; i < 1000; i++)  
  22. {  
  23.     if (double.TryParse("123", out re) == false)  
  24.     {  
  25.         re = 0;  
  26.     }  
  27. }  
  28. sw.Stop();  
  29. ticks = sw.ElapsedTicks;  
  30. Console.WriteLine("double.TryParse() 成功,{0} ticks", ticks);  
  31.  
  32. sw = Stopwatch.StartNew();  
  33. for (int i = 1; i < 1000; i++)  
  34. {  
  35.     try  
  36.     {  
  37.         re = double.Parse("aaa");  
  38.     }  
  39.     catch  
  40.     {  
  41.         re = 0;  
  42.     }  
  43. }  
  44. sw.Stop();  
  45. ticks = sw.ElapsedTicks;  
  46. Console.WriteLine("double.Parse() 失败,{0} ticks", ticks);  
  47.  
  48. sw = Stopwatch.StartNew();  
  49. for (int i = 1; i < 1000; i++)  
  50. {  
  51.     if (double.TryParse("aaa", out re) == false)  
  52.     {  
  53.         re = 0;  
  54.     }  
  55. }  
  56. sw.Stop();  
  57. ticks = sw.ElapsedTicks;  
  58. Console.WriteLine("double.TryParse() 失败,{0} ticks", ticks); 

以上这段代码的输出为:

  1. double.Parse() 成功,6661 ticks  
  2. double.TryParse() 成功,2886 ticks  
  3. double.Parse() 失败,2062347 ticks  
  4. double.TryParse() 失败,3379 ticks 

可见, Parse和TryParse方法如果执行成功,它们的效率在一个数量级上,甚至在本示例中(在一个循环内),TryParse所带来的效率比Parse还要高一些。但若执行失败,Parse的执行效率相比于TryParse就太低了。

我们将提供TryParse方法的这种行为叫做类型提供TryParse模式。TryParse模式为类型提供两个方法,假设第一个方法声明为Do,第二个方法则声明为TryDo。Do方法在执行过程中如果发生错误则引发异常,而TryDo方法会返回一个boolean值,方法执行失败返回false。如果要从TryDo中获取实际的返回值,则应该为方法提供out参数。

不过,我们并不建议为所有的类型都提供TryParse模式,只有在考虑到Do方法会带来明显的性能损耗时,才建议使用TryParse。

转自:《编写高质量代码改善C#程序的157个建议》陆敏技

C# 中Parse 和TryParse的效率问题

C#中Parse和TryParse效率的问题
  • u010533180
  • u010533180
  • 2016年10月25日 09:11
  • 2540

C#中转换函数Convert、Parse、TryParse、(int) 的区别

Convert、Parse、TryParse、(int) 三个函数都是将值转换成整数,但是四者之间各有异同,开发人员可以根据情况选用最合适的。以下解释均经过高人验证,希望对大家有所帮助。  1 ...
  • u011778428
  • u011778428
  • 2013年08月24日 14:32
  • 3077

java-转型有风险使用许谨慎

在使用类型转换时,经常会遇到类型转换错误的情况。比如 无法将String转换成int累类型等等,这里将所有的类型转换全部列举出来 保证在转换的适合不会出现错误。...
  • hfmbook
  • hfmbook
  • 2014年08月18日 15:40
  • 2623

可选参数 和 TryParse用法(C#)

可选参数有一些注意点: 1.可选参数一定程度上解脱了一些情况下必须重载的需求。 2.可选参数一定要放在所有的参数最后。 3.可选参数可以有多个,但都必须排列放在所有参数的最后。 4.方法的所有参数都可...
  • u010792238
  • u010792238
  • 2016年03月08日 11:41
  • 1413

C#中转换函数Convert、Parse、TryParse、(int) 的区别

C#中转换函数Convert、Parse、TryParse、(int) 的区别  Convert、Parse、TryParse、(int) 三个函数都是将值转换成整数,但是四者之间各有异同,开发人员...
  • yuan_lo
  • yuan_lo
  • 2013年11月03日 18:05
  • 2158

double与string类型之间的转换

在vs2005中想用c++写个算法调试工具,将有些东西进行可视化,这样就需要根据输入的东西进行计算,并将计算结果展示出来,由于知道的东西有限就只能用textbox进行写入和展示,所以就涉及到text中...
  • kangpinghuagong
  • kangpinghuagong
  • 2013年05月02日 18:07
  • 627

C#中转换函数Convert、Parse、TryParse、(int) 的区别

C#中转换函数Convert、Parse、TryParse、(int) 的区别  Convert、Parse、TryParse、(int) 三个函数都是将值转换成整数,但是四者之间各有异同,开发...
  • NCTU_to_prove_safety
  • NCTU_to_prove_safety
  • 2017年06月07日 16:27
  • 206

C#解析JSON字符串总结

原文链接:http://www.cnblogs.com/zxx193/p/3664562.html JSON文件读取到内存中就是字符串,.NET操作JSON就是生成与解析JSON字符串。 操作J...
  • u013096666
  • u013096666
  • 2017年08月01日 13:42
  • 254

方法重载|返回数组|out/ref|自己写tryparse

方法重载。与参数有关,返回值无关 //因为有重载,所以可以放不同类型的值 //为什么要重载?方便。...
  • wang18631061452
  • wang18631061452
  • 2016年04月30日 16:36
  • 338

C#知识点总结(静态类,扩展方法,TryParse用法)

打算把博客搬到CSDN上面来了,以前一直博客园写,写得到后面没什么激情了,不过呢,在CSDN上面可能没太多的朋友,因为自己是搞.NET的,CSDN上面C和JAVA的多些,不过我还是打算再这里开始我的....
  • yangliweng2
  • yangliweng2
  • 2015年06月18日 20:37
  • 681
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建议4: TryParse比Parse好
举报原因:
原因补充:

(最多只允许输入30个字)