is运算符的功能是动态检查程序对象运行时的类型是否和给定的类型相兼容。is运算符的运算结果是布尔值,具体运算格式如下:
表达式(B) is 类型(T)
is运算符的运算规则如下。
1)如果B的编译类型和T相同,且存在从B编译时的类型到T的隐式引用转换,或者装箱转换,具体规则如下。
如果B是引用类型,则运算结果和B!=null等效。
如果B是值类型,则运算结果为true。
2)如果B的编译类型和T不相同,且存在从B编译时的类型到T的显式引用转换,或者拆箱转换,具体规则如下。
如果B的值是null,则运算结果是false。
如果B的值不是null,假设R是B引用实例的运行类型,若R和T的类型相同,或R为引用类型并且存在从R到T的隐式引用转换,或R是值类型并且T是R实现了的接口类型,则运算结果是true;否则运算结果是false。
如果不是上述两种情况,则不会实现从B到T的引用转换或装箱转换,运算结果是false。
实例50:使用is运算符
下面通将过一个实例来说明使用is运算符的具体流程。本实例保存在“光盘:\daima\10”文件夹内,项目名为ismath。功能是将不同转换表达式的结果输出。实例文件的主要代码如下:
(www.xing528.com)
上述实例代码的设计流程如下。
1)定义接口mm,并在其中定义方法Save()。
2)分别定义类aa和bb,设置aa的基接口是mm,bb的基类是aa,bb的基接口是mm。
3)在类aa内定义方法Save()。
4)分别定义类aa和bb的实例对象zz和ff。
5)分别定义接口mm的对象file,根类object的对象obj。
6)通过WriteLine()输出各表达式,并输出对应的运算结果。
执行后将分别输出显示各表达式的对应运算结果,如图10-11所示。
图10-11 实例执行结果
多学一招
is运算符只能进行引用转换、装箱转换和拆箱转换,而不能进行其他类型的转换处理。C#中的is运算符,最重要的应用就是进行强制转换。
因为对象是多态的,所以基类类型的变量可以保存派生类型。若要访问派生类型的方法,需要将值强制转换回该派生类型。不过,在这些情况下,如果只尝试进行简单的强制转换,会导致引发InvalidCastException的风险。这就是C#提供is和as运算符的原因。可以使用这两个运算符来测试强制转换是否会成功,而没有引发异常的风险。通常,as运算符更高效一些,因为如果可以成功进行强制转换,它会实际返回强制转换值。而is运算符只返回一个布尔值。因此,如果只想确定对象的类型,而无需对它进行实际的强制转换,则可以使用is运算符。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。