在 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.

如果对象引用是 null, is 操作符总是返回 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.研发管理---api版本号策略与版本控制

    Atitit.研发管理---api版本号策略与版本控制 1. 1.2.1版本概述1 2. 3主版本号策略2 3. 1PATCH版本策略2 3.1. 1.2.2.1次版本号策略2 表3-1 APR中支持 ...

  2. Flex Air应用程序更改任务栏图标

    Air应用程序中相关图标更改的方法: 1.安装后的应用程序图标和运行时的任务栏图标 这两个是一起的,通过更改配置文件application.xml中的icon节点,分别针对不同大小进行设置,未设置的会 ...

  3. AndroidManifest.xml配置

    AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅.下面是一个标准的AndroidManifest.xm ...

  4. IOS设计模式的六大设计原则之里氏替换原则(LSP,Liskov Substitution Principle)

    定义 里氏替换原则的定义有两种,据说是由麻省理工的一位姓里的女士所提出,因此以其名进行命名. 定义1:如果对一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1所定义的程序P中在o1全都替换 ...

  5. [Android]通知栏与操作栏的高度-State Bar & Navigation Bar

    1.通知栏 public static int getStatusBarHeight() { Resources resources = Resources.getSystem(); int reso ...

  6. IDEA中maven打包跳过Junit Test

    运行MVN install时需要跳过Junit的test cases,可以采用下面的方法: mvn install -DskipTests 或者mvn install -Dmaven.test.ski ...

  7. MySQL - 统计每个月生日的人数

    Person表定义如下: create table person(id int primary key auto_increment, birthday datetime); Person 数据如下: ...

  8. 挂载samb目录

    不管是ubuntu还是fedora文件管理器都带有挂载浏览smb目录的工具,但是我却找不到它的挂载点,所以想用命令行拷贝东西就没办法了,还是需要使用传统的挂载方式, mount -t cifs -o ...

  9. asp.net mvc FormsAuthentication一些问题

    form验证最简单的一句 FormsAuthentication.SetAuthCookie(”userName", false); web.config里加上    <machine ...

  10. OBS (open boardcast server)结构分析

    一,简介 OBS(open boardcast server),是一个用于直播的开源软件. 官方网站:https://obsproject.com/ 代码托管地址:https://github.com ...