C# 类型转换is和as 以及性能陷阱

   1.在C#2.0之前,as只能用于引用类型。而在C#2.0之后,它也可以用于可空类型。其结果为可空类型的某个值---空值或者一个有意义的值。示例:
 1   static void Main(string[] args)
 2         {
 3             PrintValueInt32(5);
 4             PrintValueInt32("some thing!");
 5     }
 6
 7       static void PrintValueInt32(object o)
 8         {
 9             int? nullable = o as int?;
10             Console.WriteLine(nullable.HasValue ? nullable.Value.ToString() : "null");
11         }
    输出:

这样只需要一步,就可以安全的将任意引用转换为值。而在C#1.0中,你只能先使用is操作符,然后再轻质转换,这使CLR执行两次的类型检查,显然不够优雅。

2.我一直以为执行一次的检查会比两次快。实际上真的如此吗?那就来测试一下吧。

 1 static void Main(string[] args)
 2         {
 3             List<object> listobj = new List<object>();
 4             List<int?> list = new List<int?>();
 5
 6             for (int i = 0; i < 100000; i++)
 7             {
 8                 listobj.Add(i);
 9             }
10
11             Stopwatch watch = new Stopwatch();   //测试时间类
12             watch.Start();
13             foreach (var item in listobj)
14             {
15                 if (item is int)                 //is和强类型转换
16                 {
17                     list.Add((int)item);
18                 }
19             }
20             watch.Stop();
21             Console.WriteLine("is检查和强类型转换时间:{0}", watch.Elapsed);
22
23             watch.Reset();
24             watch.Start();
25             foreach (var item in listobj)
26             {
27                 int? temp = item as int?;        //as转换和空值判断,
28                 if (temp.HasValue)               //此处也可用temp!=null来判断
29                 {                   //因为temp是可空类型,有HasValue和Value等可用于对可空类型的操作
30                     list.Add(temp);
31                 }
32             }
33             watch.Stop();
34             Console.WriteLine("as转换时间:            {0}", watch.Elapsed);
35             Console.ReadKey();
36         }       

输出:

从输出的结果看,使用is检查和强类型转换时间比as转换时间少很多。在进行要频繁在引用类型和值类型之间转换的操作时,谨慎选择,避免掉入性能陷阱。

3.对于空合并运算符的使用。

空合并运算符实在C#2.0中引入的。first??second其执行步骤:

(1)对first进行求值。

(2)first非空,整个表达式的值就是first的值。

(3)否则,求second的值,作为整个表达式的值。

代码示例一,first不为空时,不管second的值是否为空,整个表达式的值都是first的值:

            int? first = 1;
            int? second = 4;
            int? temp = first ?? second;
            Console.WriteLine("{0}", (temp.HasValue ? temp.Value.ToString() : "null"));

输出:(即使second不是空,因为first非空,所以输出first的值)

代码示例二,first为空时,second的值整个表达式的值。

1             int? first = null;
2             int? second = 4;
3             int? temp = first ?? second;
4             Console.WriteLine("{0}", (temp.HasValue ? temp.Value.ToString() : "null"));

输出:

参考:《深入理解C#》(第三版)  作者:jon steek[英],译者:姚麒麟

时间: 2024-07-29 12:50:59

C# 类型转换is和as 以及性能陷阱的相关文章

警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱

警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱 以下文章来源:https://blog.csdn.net/defonds/article/details/46745143 mer_stage 表有 216423 条记录,DDL:CREATE TABLE `mer_stage` ( `STAGE_ID` int(11) NOT NULL AUTO_INCREMENT, `MER_ID` int(11) NOT NULL, `MER_CODE` varch

移动端性能陷阱和硬件加速

1.减少或避免repaint/页面重绘,reflow/页面回流 repaint:样式的变化,如颜色 reflow:变化的成本比repaint大 也可以理解为对dom元素的操作 2.尽量缓存所有可以缓存的数据 3.使用css3transform代替dom操作,animate.css 非主流性能优化原则 1.不要给非static定位元素(如absolute,relative)增加css动画 2.适当的使用硬件加速 一个简单的例子,就是把图片画到canvas上,就会触发硬件加速 或是  ,给图层加tr

移动端的性能陷阱和加速

1.减少或避免repaint, reflow; repaint即重绘页面如改变文字颜色,reflow即改变结构,整体可以理解为减少DOM操作. 2.尽量缓存数据. 3.使用CSS3 transform代替dom操作. 4.不要给非position:static添加css3动画.(会成倍增加浏览器开销) 5.适当的硬件加速.可以设置transform:translata3d(0,0,0); .

【转载】Apache Spark Jobs 性能调优(一)

当你开始编写 Apache Spark 代码或者浏览公开的 API 的时候,你会遇到各种各样术语,比如 transformation,action,RDD 等等. 了解到这些是编写 Spark 代码的基础. 同样,当你任务开始失败或者你需要透过web界面去了解自己的应用为何如此费时的时候,你需要去了解一些新的名词: job, stage, task.对于这些新术语的理解有助于编写良好 Spark 代码.这里的良好主要指更快的 Spark 程序.对于 Spark 底层的执行模型的了解对于写出效率更

Apache Spark Jobs 性能调优

当你开始编写 Apache Spark 代码或者浏览公开的 API 的时候,你会遇到各种各样术语,比如transformation,action,RDD 等等. 了解到这些是编写 Spark 代码的基础. 同样,当你任务开始失败或者你需要透过web界面去了解自己的应用为何如此费时的时候,你需要去了解一些新的名词: job, stage, task.对于这些新术语的理解有助于编写良好 Spark 代码.这里的良好主要指更快的 Spark 程序.对于 Spark 底层的执行模型的了解对于写出效率更高

Redis性能问题排查解决手册(七)

阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数据可分为10个类别,分别是: server clients memory persistence stats replication

走近伏羲,谈5000节点集群调度与性能优化

5K项目是飞天平台的里程碑,系统在规模.性能和容错方面都得到了飞跃式的发展,达到世界领先水平.伏羲作为飞天平台的分布式调度系统,能支持单集群5000节点,并发运行10000作业,30分钟完成100TB数据Terasort,性能是当时Yahoo ! 在Sort Benchmark上世界纪录的两倍. 伏羲介绍 "飞天"是阿里巴巴的云计算平台,其中的分布式调度系统被命名为"伏羲"(代码名称Fuxi),名字来自我国古代神话人物.伏羲主要负责管理集群的机器资源和调度并发的计算

iOS Core Animation Advanced Techniques(六): 基于定时器的动画和性能调优

基于定时器的动画 我可以指导你,但是你必须按照我说的做. -- 骇客帝国 在第10章“缓冲”中,我们研究了CAMediaTimingFunction,它是一个通过控制动画缓冲来模拟物理效果例如加速或者减速来增强现实感的东西,那么如果想更加真实地模拟 物理交互或者实时根据用户输入修改动画改怎么办呢?在这一章中,我们将继续探索一种能够允许我们精确地控制一帧一帧展示的基于定时器的动画. 定时帧 动画看起来是用来显示一段连续的运动过程,但实际上当在固定位置上展示像素的时候并不能做到这一点.一般来说这种显

redis性能问题排查

Redis性能问题排查解决手册(七) 2015-08-19 08:35 by 蘑菇先生, 6073 阅读, 9 评论, 收藏,  编辑  阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输