对[IS]和[AS]操作符的理解

说起来好笑
当初开始用C#代码的时候,就知道[AS]操作符。所以只好用它。尤其在WPF的数据邦定的时候,几乎每次处理控件的发生的事件中都要用到[AS]操作符。
让你的控件中的某一个属性转化为后台的数据类。当时只知道如果 返回值返回为空。那表示被转换的属性没有绑定上数据类。关于类型安全完全没有考虑到。
后来在查找的资料中看到了[IS]的操作符。所以有了一个非常有意思的用法。
if( a is ListBoxItem)
{
    ListBoxItem tempitem = a as ListBoxItem ;
}

应该这样写
ListBoxItem tempitem = a as ListBoxItem ;
if( null != tempitem )
{
    // do something
}
else
{
   // error
}
现在,看到作者的一些观点后,才知道画蛇添足了。
先补充一下基础知识。
在C#中

类型转换 分 显式转化 和 隐式转化 。
1  当基本类型和引用类型互相转化。其操作基本  基本类型转化为引用类型 -〉装箱。反之,为拆箱。
2  当有基类对象转化为子类对象的时候,必须用显式转化。 // 为什么呢? 一会查查资料
3  当有子类转化为基类对象的时候,可以使用隐式转化。  //为什么呢? 一会查查资料
4  基本类型互相之间转化可以用类Covent来操作。 // 这样的操作和直接强转由什么区别?
5  object类中有一个方法Gettype().可以得到精确类型。

概念
is/as操作符,是C#中用于类型转换的,提供了对类型兼容性的判断,从而使得类型转换控制在安全的范畴,提供了灵活的类型转换控制。

[Is]的使用规则为
检查对象类型的兼容性 并返回结果 True 或者 False
不会抛出异常
如果对象为Null,则永远返回False

[As]的使用规则为
检查对象类型的兼容性 并返回结果 不兼容就返回NULL
不会抛出异常
如果判断为空,当然在使用对象要抛出异常

[结论]
AS的效率要比IS高。
[原因]
对比一下代码就知道了

// 使用IS操作符
if(c1 is class2)
{
    Class2 c2 = (Class2)c1 ;
}

// 使用AS操作符
Class2 c2 = c1 as Class2 ;
if( null != c2)
{
    // do thing
}

对比两种方式 IS操作符做了两次类型检查。AS操作符做了一次类型检查,一次 Null判断 。
由于Null判断的效率比类型检查要高,所以AS操作符效率高一些
但是如果像我那样用。。。。。 嘿嘿。
posted @ 2007-10-29 16:41  likai进步!!!!  阅读(256)  评论(0编辑  收藏  举报