一 使用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。

改善C#程序的方法-2 使用TryParse的更多相关文章

  1. 改善C#程序的方法

    写在开头: http://www.cnblogs.com/luminji    157个建议_勘误表 一:属性 属性和方法一样.也可以是virtual和abstract. 条款2:运行时常量(read ...

  2. 改善C#程序的方法-1 操作字符串

    正确操作字符串 引言: 字符串是使用很频繁的一种数据类型. 如果使用不慎,则会为一次字符串操作所带来的额外性能开销而付出代价. 下面从这几个方面来探讨如何正确操作字符串: 1.确保尽量少的装箱,尽可能 ...

  3. 改善C#程序的方法-3 比较器和LINQ排序

    一 创建对象时考虑实现比较器 假设有这样的场景,有一个40个人的学生列表,业务中需针对学生的成绩来进行排序. 可以考虑用IComparable接口和ICompare接口实现: class Progra ...

  4. 编写高质量代码改善C#程序的157个建议——建议4: TryParse比Parse好

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

  5. 编写高质量代码改善C#程序的157个建议——建议2: 使用默认转型方法

    建议2: 使用默认转型方法 除了字符串操作外,程序员普遍会遇到的第二个问题是:如何正确地对类型实现转型.在上一个建议中,从int转型为string,我们使用了类型int的ToString方法.在大部分 ...

  6. 改善C#程序,提高程序运行效率的50种方法

    改善C#程序,提高程序运行效率的50种方法   转自:http://blog.sina.com.cn/s/blog_6f7a7fb501017p8a.html 一.用属性代替可访问的字段 1..NET ...

  7. 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)

    编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...

  8. 编写高质量代码改善C#程序的157个建议——建议150:使用匿名方法、Lambda表达式代替方法

    建议150:使用匿名方法.Lambda表达式代替方法 方法体如果过小(如小于3行),专门为此定义一个方法就会显得过于繁琐.比如: static void SampeMethod() { List< ...

  9. 编写高质量代码改善C#程序的157个建议——建议145:避免过长的方法和过长的类

    建议145:避免过长的方法和过长的类 如果违反“一个方法只做一件事”及类型的“单一职责原则”,往往会产生过长的方法和过长的类. 如果方法过长,意味着可以站在更高的层次上重构出若干更小的方法.以行数作为 ...

随机推荐

  1. 30行自己写并发工具类(Semaphore, CyclicBarrier, CountDownLatch)是什么体验?

    30行自己写并发工具类(Semaphore, CyclicBarrier, CountDownLatch)是什么体验? 前言 在本篇文章当中首先给大家介绍三个工具Semaphore, CyclicBa ...

  2. Python词频分析

    Python词频分析 一.前言 在日常工作或者生活中,有时候会遇到词频分析的场景.如果是要进行词频分析,那么首先需要对句子进行分词,将句子中的单词进行切割并按照词性进行归类. 在Python中有个第三 ...

  3. 【docker专栏7】容器自启动与守护进程停止后容器保活

    本文为大家介绍容器自启动以及docker 守护进程挂掉或者docker升级的情况下,如何保证容器服务的正常运行.主要包含三个部分 一.守护进程开机自启 在我们安装docker的时候,介绍过启动dock ...

  4. LeetCode题解-20.有效的括号

    题目 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 示例 ...

  5. Redis 定长队列的探索和实践

    vivo 互联网服务器团队 - Wang Zhi 一.业务背景 从技术的角度来说,技术方案的选型都是受限于实际的业务场景,都以解决实际业务场景为目标. 在我们的实际业务场景中,需要以游戏的维度收集和上 ...

  6. Elasticsearch-Kibana-学习笔记

    1.背景 1.1 简介 Elasticsearch 是一个分布式.高扩展.高实时的搜索与数据分析引擎.它能很方便的使大量数据具有搜索.分析和探索的能力.充分利用Elasticsearch的水平伸缩性, ...

  7. TypeScript 项目报错 Unknown file extension ".ts"

    下图是该问题的详细报错截图,经过多次捣鼓,初步猜测是模块有问题,要用 ES Module 还真是曲折,最不容易出错的就是 CommonJS 模块: 在百度.Bing 上搜索了好久的帖子也都没有相关的解 ...

  8. centos7.6内核之cfs_bandwidth下的distribute_cfs_runtime hard lockup

    接到业务兄弟报障,出现多例crash,堆栈大多数如下: KERNEL: /usr/lib/debug/lib/modules/3.10.0-957.27.2.el7.x86_64/vmlinuxDUM ...

  9. 【HMS core】【FAQ】典型问题合集7

    ​1.[HMS core][Account Kit][问题描述] 集成华为帐号服务后,登录服务异常,无法获取用户信息,报statusCode为907135001,抓取报错日志:Failed to re ...

  10. iOS影视应用+全网视频下载

    又一个新的iOS影视伪装 打开软件连续点击3次列表,然后关闭重新打开即可变身,无广告全免费高画质,还有电视直播 下载地址:https://apps.apple.com/cn/app/贴画壁纸/id16 ...