使用 C#的 is 和 as 操作符来转型
在 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 操作符来转型的更多相关文章
- 使用C#的is和as操作符来转型
开发人员经常需要将一个对象从一种类型转换为其他各种类型.C#不要求任何特殊语法即可将一个对象转换为它的任何基类型,因为向基类型的转换被认为是一种安全的隐式转换.然而,将对象转换为它的某个派生类型时,C ...
- 使用C#的is、as操作符来转型
is检查对象是否兼容于指定类型,返回Boolean值true或false.使用is永远不会抛出异常. 例:Object o=new Object(); bool b1=(o is Object);// ...
- c# 基础 object ,new操作符,类型转换
参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...
- 5.9 C++重载转型操作符
参考:http://www.weixueyuan.net/view/6387.html 注意: 转型构造函数可以将其它类型的参数转换为类类型,如果我们要进行相反的转换过程,将类类型转换为其它数据类型, ...
- 类型基础---CLR Via C#笔记一
一.所有类型都是从System.Obejct派生 1.下面两个类型定义是完全一致的: class Employee{ ... } class Employee:System.Object{ ... } ...
- C#知识点总结系列:5、CLR的组成和运转
clr基本 CLR(Common Language Runtime)是一个可由多种编程语言使用的“运行时”.(例如:c#,c++/cli,vb,f#,ironpython,ironruby,il... ...
- CLR via C#笔记
第一部分 CLR基础 CLR和JIT “运行时”如何解析类型引用 第二部分 设计类型 使用C#的is和as操作符来转型 运行时的相互联系 基元类型.引用类型和值类型 值类型的装箱和拆箱 哈希码 dyn ...
- C#的CLR组成和运转介绍
原文 clr基本 CLR(Common Language Runtime)是一个可由多种编程语言使用的“运行时”.(例如:c#,c++/cli,vb,f#,ironpython,ironruby,il ...
- CLR的组成和运转
CLR的组成和运转 clr基本 CLR(Common Language Runtime)是一个可由多种编程语言使用的“运行时”.(例如:c#,c++/cli,vb,f#,ironpython,iron ...
随机推荐
- 深入浅出--iOS的TCP/IP协议族剖析&&Socket
深入浅出--iOS的TCP/IP协议族剖析&&Socket 简介 该篇文章主要回顾--TCP/IP协议族中的TCP/UDP.HTTP:还有Socket.(--该文很干,酝酿了许久! ...
- Yarn源码分析之事件异步分发器AsyncDispatcher
AsyncDispatcher是Yarn中事件异步分发器,它是ResourceManager中的一个基于阻塞队列的分发或者调度事件的组件,其在一个特定的单线程中分派事件,交给AsyncDispatch ...
- PHP 关掉浏览器还会执行代码
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行. set_time_limit(0);// 通过set_time_limit(0)可以让程序无限制的执行下去 $int ...
- Python - json和simplejson比较(转)
From:https://stackoverflow.com/questions/712791/what-are-the-differences-between-json-and-simplejson ...
- 表单中method="post"什么意思?
表示表单中的数据以"post"方法传递.Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的 ...
- web开发之php--- mvc 模式
http://www.cnblogs.com/archy_yu/p/4229929.html
- hdu 5374 Tetris(模拟)
pid=5374">题目链接:hdu 5374 Tetris 模拟.每次进行操作时推断操作是否合法,合法才运行,否则跳过.每次一个token落地,推断一下是否有消除整行. #inclu ...
- ios 关于collectionView.performBatchUpdates()方法 --时时更新
今天想实现一个简单的collectionView动画效果,查阅相关资料发现,实现 collectionView.performBatchUpdates()方法即可,于是掉坑里了. 文档: public ...
- 48、ViewFlow ---- 滑动广告页
<!-- main.xml --> <?xml version="1.0" encoding="utf-8"?> <LinearL ...
- Linux下OpenOffice的安装与启动
公司项目需求中增加了文档预览功能,所以采用了OpenOffice提供的将office文件转换为pdf的工具.那么我们的程序运行在服务器端,服务器系统版本多是Linux,因此有必要记录下Linux下Op ...