黑马程序员技术交流社区

标题: is和as分别要在什么时候用到? [打印本页]

作者: laoyang    时间: 2011-11-22 10:41
标题: is和as分别要在什么时候用到?
本帖最后由 laoyang 于 2011-11-23 14:23 编辑

is和as分别要在什么时候用到?
作者: 何建华    时间: 2011-11-22 11:01
这两个的用法我也不是很清楚,这是我在网上查的资料,希望对你有用:

在程序中,进行类型转换是常见的事。那么在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操作符来进行类型转换的时候,如何选择目标类型在编码的时候已经很明确了,即用父类型作为目标类型,那么类型转换的目的就是转换成父类型对象进行操作;反之亦然。
转自http://blog.csdn.net/Knight94/article/details/791850






作者: 付炯    时间: 2011-11-22 11:19
is用于类型判断 as用于类型转换吧
也可以看看这篇文章 希望对你有帮助
http://wenku.baidu.com/view/a10e8c1ec5da50e2524d7f5c.html
作者: 毕山山    时间: 2011-11-22 14:00
1、AS在转换的同事兼判断兼容性,如果无法进行转换,则 as 返回 null(没有产生新的对象)而不是引发异常。有了AS我想以后就不要再用try-catch来做类型转换的判断了。因此as转换成功要判断是否为null。
2、AS是引用类型类型的转换或者装箱转换,不能用与值类型的转换。如果是值类型只能结合is来强制转换,代码如下:
object objTest = 11;

if( objTest is int )

{
    int nValue = (int )objTest;

}

3、IS只是做类型兼容判断,并不执行真正的类型转换。返回true或false,不会返回null,对象为null也会返回false。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2