注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

告别迷茫

梦想与现实的差距,就是我们生活的意义。因为我们有差距,我们才会一直积累,在努力。

 
 
 

日志

 
 

is and as  

2014-12-23 22:34:32|  分类: c#----唐老师 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

由于对象是多态的,因此基类类型的变量可以保存派生类型。若要访问派生类型的方法,需要将值强制转换回该派生类型。不过,在这些情况下,如果只尝试进行简单的强制转换,会导致引发 InvalidCastException 的风险。这就是 C# 提供 is 和 as 运算符的原因。您可以使用这两个运算符来测试强制转换是否会成功,而没有引发异常的风险。通常,as 运算符更高效一些,因为如果可以成功进行强制转换,它会实际返回强制转换值。而 is 运算符只返回一个布尔值。因此,如果只想确定对象的类型,而无需对它进行实际强制转换,则可以使用 is 运算符。

 

在程序中,进行类型转换是常见的事。那么在 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 类所涉及的静态方法


二、C#中的is

检查一个对象是否兼容于其他指定的类型,并返回一个Bool值,如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false。永远不会抛出异常
如果对象引用为null,那么is操作符总是返回为false,因为没有对象可以检查其类型。

例如

复制代码代码如下:
object o = new object();
if (o is Label)
{
    Label lb = (Label)o;
    Response.Write("类型转换成功");
}
else
{
    Response.Write("类型转换失败");   
}
  评论这张
 
阅读(1)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017