使用C#的is和as操作符来转型
开发人员经常需要将一个对象从一种类型转换为其他各种类型。C#不要求任何特殊语法即可将一个对象转换为它的任何基类型,因为向基类型的转换被认为是一种安全的隐式转换。然而,将对象转换为它的某个派生类型时,C#要求只能进行显示转换,因为这样的转换可能在运行时失败。
//该类型隐式派生自System.Object
internal class Employee{
...
}
public sealed class Program{
public static void Main(){
//不需要转型,因为new返回一个Employee对象
//而Object是Employee的基础类型
Object o = new Employee();
//需要转型,因为Employee派生自Object
Employee e = (Employee) ;
}
}
在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
is操作符通常像下面这样使用:
if (o is Employee){
Employee e = (Employee) o;
}
在这段代码中,CLR实际会检查两次对象的类型。is操作符首先核实o是否兼容于Employee类型。如果是,那么在if语句内部执行转型时,CLR再次核实o是否引用一个Employee。CLR的类型检查增强了安全性,但无疑也会对性能造成一定影响。这是因为CLR首先必须判断变量o引用对象的实际类型。然后,CLR必须遍历继承层次饥饿哦股,用每个基类型去核对指定的类型(Employee)。由于这是一个相当常用的编程模式,所以C#专门提供了as操作符,目的就是简化这种代码的写法,同时提升其性能。
Employee e = o as Employee;
if(e != null){
}
这段代码中,CLR核实o是否兼容于Employee类型;如果是,as会返回对同一个对象的非null引用。如果o不兼容于Employee类型,as操作符会返回null。注意,as操作符造成CLR只校验一次对象的类型。if语句只是检查e是否为null。
as操作符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常。
使用C#的is和as操作符来转型的更多相关文章
- 使用C#的is、as操作符来转型
is检查对象是否兼容于指定类型,返回Boolean值true或false.使用is永远不会抛出异常. 例:Object o=new Object(); bool b1=(o is Object);// ...
- 使用 C#的 is 和 as 操作符来转型
在 C#语言中进行类型转换的另一种方式是使用 is 操作符. is 检查一个对象是否兼容于指定的类型,并返回一个 Boolean 值: true 或 false.注意 is 操作符永远不会抛出异常,以 ...
- 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 ...
随机推荐
- 【usaco】patrol
很长时间都没想出来的简单题,看了题解才写出来,还是naive 原题: FJ有个农场,其中有n块土地,由m条边连起来.FJ的养牛场在土地1,在土地n有个新开张的雪糕店.Bessie经常偷偷溜到雪糕店,当 ...
- ExtJS控件样式修改及美化
Extjs项目对富客户端开发提供了强有力的支持,甚至改变了前端的开发方式,使得开发变得更加趋向于“面向组件”.对界面的美化而言,也是根本性的改变.普通的网页美工面对extjs项目根本无法下手,需要脚本 ...
- PostgreSQL: Query for location of global tablespace?
Q: I have been trying to make our database clients pro-active about not filling up the partition on ...
- How to drop a PostgreSQL database if there are active connections to it?
1.PostgreSQL 9.1 and below: SELECT pg_terminate_backend(pg_stat_activity.procpid) FROM pg_stat_activ ...
- linux服务之snmp
背景信息 http://datatracker.ietf.org/doc/rfc1213/ http://oid-info.com/get/1.3.6.1 http://oid-info.com/ge ...
- 九度OJ 1010:计算A+B【字符串和数组】
/*======================================================================== 题目1010:A + B 时间限制:1 秒内存限制 ...
- win7 关于远程桌面登陆的方法,相应服务的启动
转自:http://blog.csdn.net/ningfuxuan/article/details/7519476 远程登陆电脑,对远程电脑的设置 (1)首先要启动远程电脑中的Remote Desk ...
- java序列化---转
Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...
- 根据不同的分辨率调用不同的css
var Other1600 = "css_1600.css"; var Other1440 = "css_1440.css"; var Other1366 = ...
- 通过profile 用maven命令打不同配置的变量包
profiles定义如下 <profiles> <profile> <id>local</id> ...