在 C#语言中进行类型转换的另一种方式是使用 is 操作符。 is 检查一个对象是否兼容于指定的类型,并返回一个 Boolean 值: true false。注意 is 操作符永远不会抛出异常,以下代码进行了演示:

Object o = new Object();
Boolean b1 = (o is Object); // b1 为 true.
Boolean b2 = (o is Employee); // b2 为 false.

如果对象引用是 nullis 操作符总是返回 false,因为没有可检查其类型的对象。 is 操作符通常像下面这样使用:

if (o is Employee) {
Employee e = (Employee) o;
// 在 if 语句剩余的部分中使用 e
}

在这段代码中, CLR 实际会检查两次对象的类型。 is 操作符首先核实 o 是否兼容于 Employee 类型。如果是,那么在 if 语句内部执行转型时, CLR 再次核实 o 是否引用一个 Employee。 CLR 的类型检查增强了安全性,但无疑也会对性能造成一定影响。这是因为 CLR 首先必须判断变量( o)引用的对象的实际类型。然后, CLR 必须遍历继承层次结构,用每个基类型去核对指定的类型( Employee)。由于这是一个相当常用的编程模式,所以 C#专门提供了 as 操作符,目的就是简化这种代码的写法,同时提升其性能。

Employee e = o as Employee;
if (e != null) {
// 在 if 语句中使用 e
}

在这段代码中, CLR 核实 o 是否兼容于 Employee 类型;如果是, as 会返回对同一个对象的一个非 null引用。如果 o 不兼容于 Employee 类型, as 操作符会返回 null。注意, as 操作符造成 CLR 只校验一次对象的类型。 if 语句只是检查 e 是否为 null。这个检查的速度比校验对象的类型快得多。
as 操作符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常——相反,如果对象不能转型,结果就是 null。所以,正确的做法是检查最终生成的引用是否为 null。如果企图直接使用最终生成的引用,会抛出一个 System.NullReferenceException 异常。以下代码对此进行了演示:

Object o = new Object(); // 新建一个 Object 对象
Employee e = o as Employee; // 将 o 转型为一个 Employee
// 上述转型操作会失败,不会抛出异常,但 e 会被设为 null
e.ToString(); // 访问 e 会抛出一个 NullReferenceException 异常

使用 C#的 is 和 as 操作符来转型的更多相关文章

  1. 使用C#的is和as操作符来转型

    开发人员经常需要将一个对象从一种类型转换为其他各种类型.C#不要求任何特殊语法即可将一个对象转换为它的任何基类型,因为向基类型的转换被认为是一种安全的隐式转换.然而,将对象转换为它的某个派生类型时,C ...

  2. 使用C#的is、as操作符来转型

    is检查对象是否兼容于指定类型,返回Boolean值true或false.使用is永远不会抛出异常. 例:Object o=new Object(); bool b1=(o is Object);// ...

  3. c# 基础 object ,new操作符,类型转换

    参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...

  4. 5.9 C++重载转型操作符

    参考:http://www.weixueyuan.net/view/6387.html 注意: 转型构造函数可以将其它类型的参数转换为类类型,如果我们要进行相反的转换过程,将类类型转换为其它数据类型, ...

  5. 类型基础---CLR Via C#笔记一

    一.所有类型都是从System.Obejct派生 1.下面两个类型定义是完全一致的: class Employee{ ... } class Employee:System.Object{ ... } ...

  6. C#知识点总结系列:5、CLR的组成和运转

    clr基本 CLR(Common Language Runtime)是一个可由多种编程语言使用的“运行时”.(例如:c#,c++/cli,vb,f#,ironpython,ironruby,il... ...

  7. CLR via C#笔记

    第一部分 CLR基础 CLR和JIT “运行时”如何解析类型引用 第二部分 设计类型 使用C#的is和as操作符来转型 运行时的相互联系 基元类型.引用类型和值类型 值类型的装箱和拆箱 哈希码 dyn ...

  8. C#的CLR组成和运转介绍

    原文 clr基本 CLR(Common Language Runtime)是一个可由多种编程语言使用的“运行时”.(例如:c#,c++/cli,vb,f#,ironpython,ironruby,il ...

  9. CLR的组成和运转

    CLR的组成和运转 clr基本 CLR(Common Language Runtime)是一个可由多种编程语言使用的“运行时”.(例如:c#,c++/cli,vb,f#,ironpython,iron ...

随机推荐

  1. Atitit.uml2 api 的编程代码实现设计uml开发 使用eclipse jar java 版本

    Atitit.uml2 api 的编程代码实现设计uml开发 使用eclipse jar java 版本 1. clipse提供了UML的底层Java包, 1 2. MDTUML2Getting St ...

  2. python学习之函数返回值

    python中函数返回值的方式有2种: 1.return语句 说明:return语句执行完后,函数后续的代码将不会被执行 2.yield语句 说明:yield语句返回的是一个迭代器对象,可以通过nex ...

  3. java - day06 - arraycopy

    package day05; import java.util.Arrays; import java.util.Random; /* * 附:如果需要使用引用类,如Random类的方法, * 需要新 ...

  4. JS DOM -- 关于回车键盘事件执行事件

    一.需求制作一个模拟对话框, 二. 1.需要发送后,输入框清空 2.按enter键可发送 三.代码部分 <!DOCTYPE HTML> <html> <head> ...

  5. error: unkown OS type hvm 解决方法 kvm libvirtd 重新加载已有虚拟机信息

    想验证下最新版本的qemu的一些功能,于是将其从qemu-0.12升级到了qemu-1.4,编译安装一切都很顺利,但是当创建virtual machine时,报错如下: [root@compute-- ...

  6. c++ telescoping constructor is NOT supported until c++11

    Telescoping constructor: see Effective Java 2nd Edition Item 2 If you want to use telescoping constr ...

  7. Linux 部署jenkins + svn + mavne + tomcat8自动化部署

    1,下载Jenkins  war包   官网下载地址 https://jenkins.io/ 2.初始化安装 1)首次启动jenkins,出于安全考虑,jenkins会生成一个随机的口令到 /root ...

  8. CentOS 7 换yum源

    备份原来的源 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bk 下载阿里源 $ cd /et ...

  9. Python 爬虫实战5 模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 本篇内容 python模拟登录淘宝网页 获取登录用户的所有订单详情 ...

  10. c语言之linux下gettimeofday函数windows替换方案

    * Copyright (C) 2008 mymtom (mymtom@hotmail.com) * All rights reserved. * * Redistribution and use i ...