一 使用TryParse,而不是Parse
除string外的所有基元类型,都有两个将string类型转型为其本身类型的方法:Parse 和 TryParse。
以double类型为例,这两个方法最简单的原型为:- public static Double Parse(string s);
- public static bool TryParse(string s, out Double result);
复制代码 两者最大的区别是:如果字符串不满足转换的要求,Parse方法将引发一个异常。TryParse方法不会引发异常,它会返回false,同时将result置为0。
调用Parse方法,如果转型失败,则要将值设定为一个初始值,同时必须要捕获异常:- var str = string.Empty;
- double d;
- try
- {
- d = double.Parse(str);
- }
- catch (Exception ex)
- {
- d = 0;
- }
复制代码 而引发异常这个过程会对性能造成损耗。
从 .Net 2.0 开始,FCL开始对基元类型提供TryParse方法。
下例对Parse和TryParse做个实验对比:- double result;
- var sw = Stopwatch.StartNew();
- for (int i = 0; i < 1000; i++)
- {
- try
- {
- result = double.Parse("123");
- }
- catch
- {
- result = 0;
- }
- }
- sw.Stop();
- Console.WriteLine($"Parse Success, {sw.ElapsedTicks} ticks");
- sw = Stopwatch.StartNew();
- for (int i = 0; i < 1000; i++)
- {
- if (double.TryParse("123", out result) == false)
- {
- result = 0;
- }
- }
- sw.Stop();
- Console.WriteLine($"TryParse Success, {sw.ElapsedTicks} ticks");
- sw = Stopwatch.StartNew();
- for (int i = 0; i < 1000; i++)
- {
- try
- {
- result = double.Parse("abc");
- }
- catch
- {
- result = 0;
- }
- }
- sw.Stop();
- Console.WriteLine($"Parse Failed, {sw.ElapsedTicks} ticks");
- sw = Stopwatch.StartNew();
- for (int i = 0; i < 1000; i++)
- {
- if (double.TryParse("abc", out result) == false)
- {
- result = 0;
- }
- }
- sw.Stop();
- 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。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |