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。
- 可以转载该博客,但必须著名博客来源。
随机推荐
- C++ 可配置的类工厂
项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...
- NodeJs之Path
Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
- ASP.NET Core应用中如何记录和查看日志
日志记录不仅对于我们开发的应用,还是对于ASP.NET Core框架功能都是一项非常重要的功能特性.我们知道ASP.NET Core使用的是一个极具扩展性的日志系统,该系统由Logger.Logger ...
- C#异步编程(二)
async和await结构 序 前篇博客异步编程系列(一) 已经介绍了何谓异步编程,这篇主要介绍怎么实现异步编程,主要通过C#5.0引入的async/await来实现. BeginInvoke和End ...
- C#多线程之线程同步篇2
在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ...
- slf4j中的MDC
slf4j中MDC是什么鬼 slf4j除了trace.debug.info.warn.error这几个日志接口外,还可以配合MDC将数据写入日志.换句话说MDC也是用来记录日志的,但它的使用方式与使用 ...
- Node.js入门(一)
一.Node.js本质上是js的运行环境. 二.可以解析js代码(没有浏览器安全级的限制): 提供系统级的API:1.文件的读写 2.进程的管理 3.网络通信 三.可以关注的四个网站: 1.https ...
- CRM 数据密钥 忘记 解决方案
UPDATE EmailServerProfile SET IncomingPassword=nullUPDATE EmailServerProfile SET OutgoingPassword=nu ...
- 简述我的SOA服务治理
SOA服务治理 1.解决业务部门服务冲突和纠纷2.版本定义与版本管理3.服务备案与服务管理4.业务监督与服务监控 SOA的战略目的 一.业务价值胜过技术策略 二.战略目标胜过具体项目的效益 三.内置的 ...