开发人员经常需要将一个对象从一种类型转换为其他各种类型。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操作符来转型的更多相关文章

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

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

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

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

  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. hdu5443(2015长春赛区网络赛1007)暴力

    题意:给了一个数列,有多个询问,每个询问求某个区间内的最大值 数列长度 1000,询问个数 1000,静态,并不需要RMQ这些,直接暴力 n2 查找每个询问区间取最大值就行了. #include< ...

  2. Git错误non-fast-forward

    Git错误non-fast-forward后的冲突解决 [日期:2012-04-21] 来源:Linux社区  作者:chain2012 [字体:大 中 小]   当要push代码到git时,出现提示 ...

  3. Oracle升级前备份和失败回退

    一.升级前备份 1.软件备份[root@localhost backup]# su - oracle [oracle@localhost ~]$ cd $ORACLE_HOME[oracle@loca ...

  4. 理解MySQL——复制(Replication)

    1.复制概述 1.1.复制解决的问题数据复制技术有以下一些特点:(1)    数据分布(2)    负载平衡(load balancing)(3)    备份(4)    高可用性(high avai ...

  5. js字符串函数

    JS自带函数concat将两个或多个字符的文本组合起来,返回一个新的字符串.var a = "hello";var b = ",world";var c = a ...

  6. centos7下环境配置

    1:  安装memcached 问题:error: libevent is required. If it's already installed, specify its path using –w ...

  7. Code First 约定

    Code First 约定 借助 Code First,可通过使用 C# 或 Visual Basic .NET 类来描述模型.模型的基本形状可通过约定来检测.约定是规则集,用于在使用 Code Fi ...

  8. python_Day3[set集合,函数,全局变量之篇]

    一.set集合 1.Set集合特点:无序.不重复,可嵌套 2.set集合创建规则:set = {"123","234"} 字典创建规则:dic = {“Key” ...

  9. Windows帐户类型

    摘自:http://blog.csdn.net/shineorrain/article/details/18181707 LocalSystem   账户  LocalSystem是预设的拥有本机所有 ...

  10. paas-openshift

    https://www.openshift.com/pricing/index.htmlOpenShift是红帽的云开发平台即服务(PaaS).自由和开放源码的云计算平台使开发人员能够创建.测试和运行 ...