C#中is和as、向上强制转换和向下强制装换之详解
来源:互联网 发布:西安爱知 编辑:程序博客网 时间:2024/06/05 07:41
首先,第一个出现的是is,有时,我们需要查看某个类是否实现了一个接口,这个时候就可以使用is关键字来找出答案:
<span style="font-family:SimHei;font-size:18px;">for(int I = 0; i< bees.Length; i++){ if(bees[i] is IWorker){ //code do something. }}</span>注:接口用I开头。
除此之外,使用is不仅可以查看某个类是否实现了一个接口,也可以查看派生了哪个类。在这儿需要注意如果查看派生了哪个类,格式为:powerConsumer is CoffeeMaker,其中powerConsumer是父类的引用,CoffeeMaker是子类。这一点需要注意。
其次,第二个出现的是as,is指出一个对象实现了什么,as告诉编译器如何看待一个对象:
<span style="font-family:SimHei;font-size:18px;">for(int i =0; i< bees.Length; i++){if(bees[i] is IWorker){IWorker thisWorker;thisWorker = bees[i] as IWorker;thisWorker.dowork(); }}</span>
注意:上例使用as将一个对象看成了其实现的接口时,thisWorker只能使用接口中的方法,不能使用原来类中的方法。
这时,向上强制转换和向下强制转化进入视野。首先来看向上强制转换:用子类代替基类时(比如用一个咖啡机代替家用电器),称为向上强制转换(upcasting),向上强制转换唯一的缺点是,只能使用基类的属性和方法。例如:Appliance是一个家用电器基类,CoffeeMaker是一个继承自Appliance的子类。声明如下:
<span style="font-family:SimHei;font-size:18px;">Appliance powerConsumer = new CoffeeMaker();powerConsumer.ConsumePower();</span>解读如下:上述程序可以分解为如下:
<span style="font-family:SimHei;font-size:18px;">Appliance powerConsumer;powerConsumer = new CoffeeMaker();powerConsumer.ConsumePower();</span>
首先程序创建一个Appliance类型的变量名为powerConsumer的引用,这个时候内存中没有任何东西。接着创建一个指向CoffeeMaker的实例对象,将powerConsumer引用指向这个实例对象,此时内存中有了一个CoffeeMaker类的实例对象,但是引用类型为Appliance,此时,使用powerConsumer变量时,将其看作Appliance类型使用,并不是CoffeeMaker,虽然内存中存在的是CoffeeMaker类的实例对象,之所以这样是合理有效的原因是CoffeeMaker继承自Appliance。如下所示,原理一样:
<span style="font-family:SimHei;font-size:18px;">Appliance[] kitchenWare = new Appliance[];kitchenWare[0] = new CoffeeWorker();kitchenWare[1] = new Oven();</span>
有了向上强制转换,那就必须要向下强制转换(downcasting):也就是将先前的向上强制转化引用变回来。可以使用is关键字明确一个Appliance对象是否实际上是一个CoffeeMaker,一旦确定,可以使用as关键字把这个Appliance再变回为一个CoffeeMaker。
<span style="font-family:SimHei;font-size:18px;">if(powerConsumer is CoffeeWorker){ CoffeeWorker javaJoe = powerConsumer as CoffeeWorker; javaJoe.MakeCoffee();}</span>
到这里,is和as、向上强制转换和向下强制转换讲解完毕,希望对大家有所帮助!
0 0
- C#中is和as、向上强制转换和向下强制装换之详解
- 向上类型强制转换和向下类型强制转换
- C#的as, is和类型强制转换
- 3、强制类型转换、as和is
- 读书笔记之C#的is和as操作符强制类型转换
- 读书笔记之C#的is和as操作符强制类型转换收藏
- C#中 As 和强制转换的总结
- C#中 As 和强制转换的总结
- C#中 As 和强制转换的总结
- C#中 As 和强制转换的总结
- 向上转换,向下转换,强制转换浅析
- C++中的向上类型转换和向下类型转换+四种强制类型转换
- C++中的向上类型转换和向下类型转换+四种强制类型转换
- java 向上 类型转换 和 向下类型转化 与 强制类型转换
- 从IL看强制转换和is,as
- 黑马程序员--.Net学习日记——C#强制转换as is 的用法和区别
- 【C#中的as和强制转换的区别】
- as和()强制类型转换的区别
- 使用活动条ActionBar---实现Tab以及下拉式导航---导航方便你我他
- 指针与数组
- vs2013 c++ ATL 制作COM组件
- 对数组名取地址得到的是什么?
- 面试题 8
- C#中is和as、向上强制转换和向下强制装换之详解
- 很火的ES5(js数组函数)初体验
- PHPCMS 每天登陆自动送积分
- C++面试宝典2011版
- 数据结构之线性表
- Hibernate中的merge方法详解
- mysql允许远程访问 root
- 异常捕捉
- leetcode笔记:Single Number II