is和as
1 概述
1.1 了解相关基本概念
a.隐式转换:对于值类型,低精度=>高精度。eg:int=>long;对于引用类型,子类向祖宗类转换过程。eg:对象=>Object。
b.显示转换:显示转换是隐式转换的逆过程。
c.拆箱与装箱。
d.GetType获取对象类型( System.Object.ReferenceEquals(Object obj1,Object obj2)) 。
e.基本类型:Convert类。
f.Parse()
g.ToString()
1.2 为什么要用is和as
在类型转换时,对于事先并不知对象的具体类型时,为了避免转换失败造成系统崩溃问题,我们一般在容易出现问题或者有可能出现问题(当时并不能确定是否会发生异常)的地方,用try......catch.....finally....来规避程序崩溃等问题,当然这样做也方便测试,这就是is和as的功能之一,除此之外,对系统进行性能优化时,能不用try....catch....就尽量不用,is和as满足这一原则。
2 示例
2.1 is用法
is判断某个对象是否兼容另一个对象。永远不会抛出异常。其返回值类型为布尔类型,若兼容,则返回true;若不兼容,则为false;若对象为空null,则为false。一般结构如下:
if (A is B)//第一次兼容检查
{
B b=(B)A;//第二次兼容检查
}A 分析:对于is,CLR会进行2次兼容性检查,第一次判断A is B,若为真,则再次进行兼容检查B b=(B)A;
例1:兼容
Label lbl = new Label();
if (lbl is Object)
{
Object objLbl = (Object)lbl;
Response.Write("true");
}
else
{
Response.Write("false");
} 测试结果为:true
例2:不兼容
Label lbl = new Label();
if (lbl is TextBox)
{
Response.Write("true");
}
else
{
Response.Write("false");
}
测试结果为:false
例3:对象为NULL
Label lbl = null;
if (lbl is Object)
{
Response.Write("true");
}
else
{
Response.Write("false");
}
测试结果:false
2.2 as用法
as判断某个对象是否兼容另一个对象。永远不会抛出异常,若兼容,则返回结果;若不兼容,则返回null;若为空,则返回null。
例1:兼容
Label lbl1 = new Label();
Label lbl2 =lbl1 as Label;
Response.Write(lbl2);//System.Web.UI.WebControls.Label
例2:不兼容
string str = "AS转换";
Label lbl = str as Label;//显示编译错误
Response.Write(lbl);
例3: 对象为NULL
Object obj = null;
Label lbl = obj as Label;
Response.Write(lbl);//null
2.3 is和as比较
由于CLR对is会进行两次检查,对as只进行一次检查,故as效率要高一些,一般情况下,使用as而不使用is.
3 参考文献
【01】 http://developer.51cto.com/art/200908/145432.htm;http://developer.51cto.com/art/200908/145432.htm
4 版权
- 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
- 博主网址:http://www.cnblogs.com/wangjiming/。
- 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
- 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2016177728@qq.com。
- 可以转载该博客,但必须著名博客来源。
随机推荐
- 【小程序分享篇 二 】web在线踢人小程序,维持用户只能在一个台电脑持登录状态
最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考. 换工作心里挺忐忑, 对未来也充满了憧憬与担忧.(虽然已是老人, 换了N次工作了,但每次心里都和忐忑). 写写代 ...
- boosting、adaboost
1.boosting Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数.他是一种框架算法,主要是通过对样本集的操作获 ...
- 《Django By Example》第五章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:大家好,我是新来的翻译, ...
- UWP学习目录整理
UWP学习目录整理 0x00 可以忽略的废话 10月6号靠着半听半猜和文字直播的补充看完了微软的秋季新品发布会,信仰充值成功,对UWP的开发十分感兴趣,打算后面找时间学习一下.谁想到学习的欲望越来越强 ...
- .NET平台开源项目速览(16)C#写PDF文件类库PDF File Writer介绍
1年前,我在文章:这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)中(第9个项目),给大家推荐了一个开源免费的PDF读写组件 PDFSharp,PDFSharp我2年前就看过 ...
- 自己实现一个javascript事件模块
nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...
- 快递Api接口 & 微信公众号开发流程
之前的文章,已经分析过快递Api接口可能被使用的需求及场景:今天呢,简单给大家介绍一下微信公众号中怎么来使用快递Api接口,来完成我们的需求和业务场景. 开发语言:Nodejs,其中用到了Neo4j图 ...
- 声音分贝的概念,dBSPL.dBm,dBu,dBV,dBFS
需要做个音频的PPM表,看着一堆的音频术语真是懵了,苦苦在网上扒了几天的文档,终于有了点收获,下面关于声音的分贝做个总结. 分贝 Decibel 分贝(dB)是一个对数单位(logarithmic u ...
- canvas快速绘制圆形、三角形、矩形、多边形
想看前面整理的canvas常用API的同学可以点下面: canvas学习之API整理笔记(一) canvas学习之API整理笔记(二) 本系列文章涉及的所有代码都将上传至:项目代码github地址,喜 ...
- Maven(一)linux下安装
1.检查是否安装JDK,并且设置了环境变量(JAVA_HOME): echo $JAVA_HOME java -version 运行结果: 显示jdk的安装路径,和java的版本,如: #jdk路径 ...