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。
- 可以转载该博客,但必须著名博客来源。
随机推荐
- 使用 Nodejs 搭建简单的Web服务器
使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...
- C语言 · 查找整数 · 基础练习
问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个. 输入格式 第一行包含一个整数n. 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000. 第三行包含一个 ...
- 利用SQLServer数据库发送邮件
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 这个应用案例很多,一般都是预警,比如异常连接的时候,或者数据库报错的时候.等等,,, 先 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(75)-微信公众平台开发-用户管理
系列目录 前言 本节主要是关注者(即用户)和用户组的管理,微信公众号提供了用户和用户组的管理,我们可以在微信公众号官方里面进行操作,添加备注和标签,以及移动用户组别,同时,微信公众号也提供了相应的接口 ...
- javascript匹配各种括号书写是否正确
今天在codewars上做了一道题,如下 看上去就是验证三种括号各种嵌套是否正确书写,本来一头雾水,一种括号很容易判断, 但是三种怎么判断! 本人只是个前端菜鸟,,不会什么高深的正则之类的. 于是,在 ...
- MySQL设置字段的默认值为当前系统时间
问题产生: 当我们在对某个字段进行设置时间默认值,该默认值必须是的当前记录的插入时间,那么就将当前系统时间作为该记录创建的时间. 应用场景: 1.在数据表中,要记录每条数据是什么时候创建的,应该由数据 ...
- Java进击C#——前言
本章简言 记得三年前笔者来到现在的公司的时候,公司人口不出十个人.那个时候笔者刚从日本回来,想在福州.厦门.青岛找一个合适自己发展的机会.最后我的一个福州的朋友打电话希望我能过去帮他,跟他一起创业.这 ...
- pandas基础-Python3
未完 for examples: example 1: # Code based on Python 3.x # _*_ coding: utf-8 _*_ # __Author: "LEM ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- css中line-height行高的深入学习
之前对css中行高line-height的理解还是有些肤浅,深入后才发觉里面包罗万象.学习行高line-height,首先从基本原理开始 (标注该文章转载 http://www.cnblogs.com ...