C# 类型转换is和as 以及性能陷阱
1.在C#2.0之前,as只能用于引用类型。而在C#2.0之后,它也可以用于可空类型。其结果为可空类型的某个值---空值或者一个有意义的值。
示例:
static void Main(string[] args)
{
PrintValueInt32();
PrintValueInt32("some thing!");
} static void PrintValueInt32(object o)
{
int? nullable = o as int?; //as类型转换,如果转换成功,nullable的HasValue是true,Value中存储的值就是转换后的值。
Console.WriteLine(nullable.HasValue ? nullable.Value.ToString() : "null");
}
输出:
这样只需要一步,就可以安全的将任意引用类型转换为值类型。而在C#1.0中,你只能先使用is操作符,然后再轻质转换,这使CLR执行两次的类型检查,显然is和强类型转换不够优雅。
2.我一直以为执行一次的检查会比两次快。实际上真的如此吗?那就来测试一下吧。
static void Main(string[] args)
{
List<object> listobj = new List<object>();
List<int?> list = new List<int?>(); for (int i = ; i < ; i++)
{
listobj.Add(i);
} Stopwatch watch = new Stopwatch(); //测试时间类
watch.Start();
foreach (var item in listobj)
{
if (item is int) //is和强类型转换
{
list.Add((int)item);
}
}
watch.Stop();
Console.WriteLine("is检查和强类型转换时间:{0}", watch.Elapsed); watch.Reset();
watch.Start();
foreach (var item in listobj)
{
int? temp = item as int?; //as转换和空值判断,
if (temp.HasValue) //此处也可用temp!=null来判断
{ //因为temp是可空类型,有HasValue和Value等可用于对可空类型的操作
list.Add(temp);
}
}
watch.Stop();
Console.WriteLine("as转换时间: {0}", watch.Elapsed);
Console.ReadKey();
}
输出:

从输出的结果看,使用is检查和强类型转换时间比as转换时间少很多。在进行要频繁在引用类型和值类型之间转换的操作时,谨慎选择,避免掉入性能陷阱。
3.对于空合并运算符的使用。
空合并运算符实在C#2.0中引入的。first??second其执行步骤:
(1)对first进行求值。
(2)first非空,整个表达式的值就是first的值。
(3)否则,求second的值,作为整个表达式的值。
代码示例一,first不为空时,不管second的值是否为空,整个表达式的值都是first的值:
int? first = ;
int? second = ;
int? temp = first ?? second;
Console.WriteLine("{0}", (temp.HasValue ? temp.Value.ToString() : "null"));
输出:(即使second不是空,因为first非空,所以输出first的值)
代码示例二,first为空时,second的值整个表达式的值。
int? first = null;
int? second = ;
int? temp = first ?? second;
Console.WriteLine("{0}", (temp.HasValue ? temp.Value.ToString() : "null"));
输出:
参考:《深入理解C#》(第三版) 作者:jon steek[英],译者:姚麒麟
C# 类型转换is和as 以及性能陷阱的更多相关文章
- 警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱
警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱 以下文章来源:https://blog.csdn.net/defonds/article/details/4 ...
- Java 8并行流的性能陷阱
并行化流被分成多个块,每个块独立处理,结果在最后汇总. CPU密集型代码如下: private long countPrimes(int max) { return range(1, max) ...
- Redis性能问题排查解决手册(七)
阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关的数据指标 通过Red ...
- Spring/Hibernate 应用性能优化的7种方法
对于大多数典型的 Spring/Hibernate 企业应用而言,其性能表现几乎完全依赖于持久层的性能.此篇文章中将介绍如何确认应用是否受数据库约束,同时介绍七种常用的提高应用性能的速成法.本文系 O ...
- [python]用profile协助程序性能优化
转自:http://blog.csdn.net/gzlaiyonghao/article/details/1483728 本文最初发表于恋花蝶的博客http://blog.csdn.net/lanph ...
- [Unity 3D] Unity 3D 性能优化(二)
IsAlive U3D的粒子系统脚本接口相信很多人都用过,ParticleSyetem类的一系列接口都有一个bool类型的参数——withChildren,通过这个参数可以直接将相同的判断或者操作应用 ...
- Redis性能问题排查解决手册
转自:http://www.cnblogs.com/mushroom/p/4738170.html 阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_comma ...
- [iOS Animation]-CALayer 性能优化
性能优化 代码应该运行的尽量快,而不是更快 - 理查德 在第一和第二部分,我们了解了Core Animation提供的关于绘制和动画的一些特性.Core Animation功能和性能都非常强大,但如果 ...
- Spring / Hibernate 应用性能调优
来源:ImportNew - 陈晓舜 对大部分典型的Spring/Hibernate企业应用来说,应用的性能大部分由持久层的性能决定. 这篇文章会重温一下怎么去确认我们的应用是否是”数据库依赖(dat ...
随机推荐
- jquery.vilidate的运用
vilidate是jquery的一个form表单验证插件非常实用 里面需要注意的就是remote的用法 /*验证*/$().ready(function() { $(".form_al ...
- HTML 5入门知识(五)
本地存储Web Storage 使用HTML 5的Web Storage功能,可以在客户端存储更多的数据,而且可以实现数据在多个页面中共享甚至是同步. cookie存储数据的不足 cookie可用于在 ...
- koahub软件市场微信编辑器源码,可下载
管理过公众平台的小伙伴都知道,公众平台最重要的是图文的编辑和发布,由于微信公众平台的图文编辑页面比较简陋,功能和样式的比较少,所以一般都是使用专业的微信图文编辑器,koahub软件市场里有一款专门编辑 ...
- 算法模板——AC自动机
实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有 ...
- 使用git部署服务器
每回上传服务器是把我的web项目打包成war上传到服务器根目录下,总是觉得很麻烦,并且每次就算只添加或修改了一个文件,都要把整个服务器war包上传.于是我学着用git部署我的web项目 下面是详情: ...
- Office 365开发概述及生态环境介绍(二)
本文于2017年3月19日首发于LinkedIn,原文链接在这里 在上一篇 文章,我给大家回顾了Office发展过来的一些主要的版本(XP,2003,2007,2013等),以及在Office客户端中 ...
- 因为本地没有配置 localhost 导致的 eclipse 的奇葩问题
因为电脑没有配置 127.0.0.1 localhost,已经碰到两次奇葩问题了. 问题一: 我的博文http://www.cnblogs.com/sonofelice/p/5143746.html中 ...
- PHP的简单易懂文件管理,可实现基本功能
我们利用的是嵌入PHP代码和ajax结合的方式,首相想到的是利用遍历文件的方式找出分件下的目录和文件,并且找到它们的路径,使用 dirname取上级目录, basename从完整路径中取文件名,其中最 ...
- C# .NET 逻辑层的框架设计
前述:在我的了解中,一个大项目的逻辑层是不可捉摸的,对于不同项目或场景都是不同的逻辑.先说明,我的想法是对逻辑层类结构,以及如何操作逻辑的方法进行抽象的封装.并且考虑将不同类,或者不同程序集中的逻辑方 ...
- java学习(一)静态代码块 构造代码块 构造方法的执行顺序及注意问题
今天我总结了一下java中静态代码块 构造代码块 构造方法的执行顺序及其注意问题 首先要知道静态代码块是随着类的加载而加载,而构造代码块和构造方法都是随着对象的创建而加载 当时做了这么一个小案例(想必 ...