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 以及性能陷阱的更多相关文章

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

    警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱 以下文章来源:https://blog.csdn.net/defonds/article/details/4 ...

  2. Java 8并行流的性能陷阱

    并行化流被分成多个块,每个块独立处理,结果在最后汇总. CPU密集型代码如下: private long countPrimes(int max) {     return range(1, max) ...

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

     阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关的数据指标 通过Red ...

  4. Spring/Hibernate 应用性能优化的7种方法

    对于大多数典型的 Spring/Hibernate 企业应用而言,其性能表现几乎完全依赖于持久层的性能.此篇文章中将介绍如何确认应用是否受数据库约束,同时介绍七种常用的提高应用性能的速成法.本文系 O ...

  5. [python]用profile协助程序性能优化

    转自:http://blog.csdn.net/gzlaiyonghao/article/details/1483728 本文最初发表于恋花蝶的博客http://blog.csdn.net/lanph ...

  6. [Unity 3D] Unity 3D 性能优化(二)

    IsAlive U3D的粒子系统脚本接口相信很多人都用过,ParticleSyetem类的一系列接口都有一个bool类型的参数——withChildren,通过这个参数可以直接将相同的判断或者操作应用 ...

  7. Redis性能问题排查解决手册

    转自:http://www.cnblogs.com/mushroom/p/4738170.html 阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_comma ...

  8. [iOS Animation]-CALayer 性能优化

    性能优化 代码应该运行的尽量快,而不是更快 - 理查德 在第一和第二部分,我们了解了Core Animation提供的关于绘制和动画的一些特性.Core Animation功能和性能都非常强大,但如果 ...

  9. Spring / Hibernate 应用性能调优

    来源:ImportNew - 陈晓舜 对大部分典型的Spring/Hibernate企业应用来说,应用的性能大部分由持久层的性能决定. 这篇文章会重温一下怎么去确认我们的应用是否是”数据库依赖(dat ...

随机推荐

  1. Bat再次小试

    继<Bat小试牛刀>之后,今天又需要一个小的bat文件.需求是这样的,有一个windows服务(服务名:xxxx,进程映像名:xxxx.exe)被数据库拖慢了,但目前又没时间调整代码,所以 ...

  2. Java进制转换示例

    收藏的代码,以备查询之用.进制之间转换都是以十进制作为中间层的. int os = 16; //十进制转成十六进制: Integer.toHexString(os); //十进制转成八进制 Integ ...

  3. LeetCode 2. Add Two Numbers 解题报告

    题意: 有两个链表,它们表示逆序的两个非负数.例 (2 -> 4 -> 3)表示342,求两个数字的和,并用同样的方式逆序输出.如342+465 = 807,你需要把结果表达为(7 -&g ...

  4. 大数据系列之Hadoop分布式集群部署

    本节目的:搭建Hadoop分布式集群环境 环境准备 LZ用OS X系统 ,安装两台Linux虚拟机,Linux系统用的是CentOS6.5:Master Ip:10.211.55.3 ,Slave ...

  5. MacOS无法登录App Store修复

    MacOS无法登录App Store修复 2017-03-10 21:13:39  by:SemiconductorKING 先上图: 惨红色的提示信息,把你拒之App Store门外,但是对之放弃. ...

  6. 开源中文分词工具探析(五):FNLP

    FNLP是由Fudan NLP实验室的邱锡鹏老师开源的一套Java写就的中文NLP工具包,提供诸如分词.词性标注.文本分类.依存句法分析等功能. [开源中文分词工具探析]系列: 中文分词工具探析(一) ...

  7. struct 和typedef struct的区别

    和int char一样struct也是一种数据类型,也可以声明变量--结构变量. 定义结构体变量的一般格式为: struct 结构名 { 类型 变量名; 类型 变量名; ... }结构变量; 另一种常 ...

  8. [ZooKeeper.net] 3 ZooKeeper的分布式锁

    基于ZooKeeper的分布式锁 ZooKeeper 里实现分布式锁的基本逻辑: 1.zookeeper中创建一个根节点(Locks),用于后续各个客户端的锁操作. 2.想要获取锁的client都在L ...

  9. 防火墙之netfailt、iptables详解

    [TOC] Iptables入门 # 1.iptables介绍 linux的包过滤功能,即linux防火墙,它由netfilter 和 iptables 两个组件组成. netfilter 组件也称为 ...

  10. 用js控制css属性

    在用js控制css属性时,行内css属性可以任意控制,但若是在<style></style>中写的css属性,均不能用alert读取,但是赋值却有几种现象, 第一种:无法读取, ...