《Effective C#》Item 3:使用as和is操作符来做类型转换

原创 2006年06月12日 16:38:00

在程序中,进行类型转换是常见的事。那么在C#中支持以前语言的类型转换方法,即用类型名进行强行转换,例如:

object objTest = new NewType();

NewType newValue = (NewType)objTest;

 

但是这样转换,有个严重的问题,就是在把objTest强转换成NewType类型对象的时候,这个过程是不安全的,因此需要用try-catch语句来进行保护。这样一来,比较安全的代码方式应该如下所示。

    object objTest = new NewType();

    NewType newValue = null;

    try

    {

        newValue = (NewType)objTest;

    }

    catch( Exception err )

    {

        MessageBox.Show( err.Message );

    }

 

但是如上的写法在C#中已经属于过时的写法,而且也属于比较低效的写法。在C#中比较高效而且安全的写法,应该用as操作符,那么完成如上类似功能的正确代码应该如下。

    object objTest = new NewType();

    NewType newValue = objTest as NewType;

 

那么很明显,如上的写法首先看起来很简便,至少代码数量和强转方式一样。至于安全性,对于as操作符来说,它不会做过的转换操作,当需要转换对象的类型属于转换目标类型或者转换目标类型的派生类型的时候,那么此转换操作才能成功,而且并不产生新的对象。因此用as来进行类型转换使安全的。为什么用as操作符进行类型转换的效率要高于老式的类型转换的,因为用as操作符进行转换就如前面所说的,首先判断当前对象的类型,当类型满足要求后才进行转换。而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要加上try-catch,这就决定了它的效率不会高于as操作符的效率。

 

要注意的时候,不管用传统方式,还是用as操作符进行类型转换之后,在使用之前,需要进行判断转换是否成功,如下:

    if( newValue!= null )

    {

        //Work with the object named "newValue"

    }

 

但是,使用as操作符有如下几点限制。

第一个就是,不用在类型之间进行类型转化,即如下编写就会出现编译错误。

NewType newValue = new NewType();

NewType1 newValue = newValue as NewType1;

 

第二个就是,不能应用在值类型数据,即不能如下写(也会出现编译错误)。

    object objTest = 11;

    int nValue = objTest as int;

 

对于第一点所提的,可以用传统的类型转换方式来完成,但是光用如下的方式,是不能正确完成。

    NewTypeOne newTestOne = new NewTypeOne();

    NewTypeTwo newTestTwo = (NewTypeTwo)newTestOne;

 

但是光如上写是不能完成的,要想使如上的操作能正确完成,在原有类型中增加类型转换操作符函数,即需要完成类似如下的代码。

    public class NewTypeOne

    {

        public static  explicit operator NewTypeTwo( NewTypeOne objTest )

        {

            //Convert object into new type

        }

    }

 

对于第二点所提的,在C#中可以使用is操作符,再加上老式的类型转换操作,就可以安全完成转换,那么要完成如上操作,正确的写法如下。

    object objTest = 11;

    if( objTest is int )

    {

        int nValue = (int)objTest;

    }

 

除了如上两点限制外,在用as操作符来进行类型转换的时候,有个细微的问题。在前面所说的,用as来进行类型转换的时候,所要转换的对象类型必须是目标类型或者转换目标类型的派生类型,那么这样就有个问题,即用as操作符来进行类型转换的时候无法转换成正确的类型,也就是说本来应该转换成子类型,却转换成了父类型。但是我并不认为这是个严重问题,因为在用as操作符来进行类型转换的时候,如何选择目标类型在编码的时候已经很明确了,即用父类型作为目标类型,那么类型转换的目的就是转换成父类型对象进行操作;反之亦然。

 

C#中已经提供了一个很好的类型转换方式,那么在进行类型转换的时候,可以按照如下的方式进行选择。

类型转换

使用选择

Object => 已知引用类型

使用as操作符来完成

Object => 已知值类型

先使用is操作符来进行判断,再用类型强转方式进行转换

已知引用类型之间转换

首先需要相应类型提供转换函数,再用类型强转方式进行转换

已知值类型之间转换

最好使用系统提供的Convert类所涉及的静态方法

 

【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则

我们知道,在C++领域,作为进阶阅读材料,必看的书是《Effective C++》。 而《Effective C#》之于C# ,是类似《Effective C++》之于C++一样的存在。 这篇文章,将...
  • zhmxy555
  • zhmxy555
  • 2016年12月25日 15:47
  • 16577

C#操作符??和?:用法

先看如下代码:   string strParam =Request.Params["param"]; if ( strParam== null ) {    strParam= ""; }   st...
  • lybwwp
  • lybwwp
  • 2016年05月05日 17:47
  • 2480

Item 31:最小化文件之间的编译依赖 Effective C++笔记

Item 31: Minimize compilation dependencies between files. 曾听老师讲过,每天上班的第一件事就是下载最新代码开始编译,然后可以有半个小...
  • yangjvn
  • yangjvn
  • 2015年09月19日 11:56
  • 843

【总结】Effective java经验之谈,类与接口

本章描述的是,自己在做系统重构的时候,阅读的章节,给自己在架构方面提供很大帮助。总结出一些干货分享一下啊啊啊~~主要应用场景是编写类与接口的时候需要注意的问题。每一章不一定按照顺序更新。欢迎拍砖补充。...
  • superMarss
  • superMarss
  • 2015年04月08日 14:45
  • 1173

C++ 隐式类类型转换和转换操作符

C++ 隐式类类型转换和转换操作符
  • u011418878
  • u011418878
  • 2017年05月25日 11:12
  • 88

Effective C# Item3:操作符as或is优于强制转换

C#是一种强类型的变成语言,我们一般情况下,不推荐大家对变量的类型进行转换,但是针对代码底层来说,为了对业务代码提供尽可能多的支持,很多时候对方法参数的类型不会做强行限制,而只是将其置为System....
  • yin554393109
  • yin554393109
  • 2014年07月24日 10:40
  • 250

Item 3:尽量使用常量 Effective C++笔记

Item 3: Use const whenever possible 尽量使用常量。不需多说,这是防卫型(defensive)程序设计的原则, 尽量使用常量限定符,从而防止客户错误地使用你...
  • yangjvn
  • yangjvn
  • 2015年08月20日 13:55
  • 576

LINQ查询运算符

LINQ查询运算符   楼主先声明一点,如果你单纯的指望看看楼主的博客就能把LINQ看明白了,楼主觉得是不现实的,楼主的博客里连个像样的案例都没有,我写博客原因无非就是...
  • shanyongxu
  • shanyongxu
  • 2016年03月09日 17:43
  • 1336

【总结】Effective java经验之谈,并发编程

内容包括,并发与并行,并发约束,并发下的集合类性能分析,并发相关包的概述,并发场景,并发总结集合包...
  • superMarss
  • superMarss
  • 2015年04月22日 17:49
  • 1919

前端学习之JavaScript(二)

1、今天在做题的时候有一道题是这样的,移除第一位元素并返回第一个元素的值。 用shift可以移除第一位元素并且返回第一位元素的值,所以只要 return arr.shift();就可以一举两得啦。 ...
  • Angie_Q
  • Angie_Q
  • 2017年05月30日 11:40
  • 267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《Effective C#》Item 3:使用as和is操作符来做类型转换
举报原因:
原因补充:

(最多只允许输入30个字)