C#类型转换

匿名 (未验证) 提交于 2019-12-02 22:09:29

一、类型转换

先介绍两个前置知识:

一是C#代码会经过编译期和运行期两个状态,前者表示代码是否通过语法检验,后者表示代码在用户使用过程中。

二是C#的所有类型都是从System.Object派生的(其中Object类等于object关键字)。

在继承关系中,使用基类代替派生类作为字段/属性类型、参数类型或返回值类型比使用派生类本身要好用得多。代码如下:

 1 /// <summary>  2 /// 会员  3 /// </summary>  4 public abstract class Member //隐式继承于object  5 {  6     /// <summary>  7     /// 积分  8     /// </summary>  9     protected int score; 10     /// <summary> 11     /// 添加积分 12     /// </summary> 13     /// <param name="num"></param> 14     public abstract void AddIntegral(int num); 15 } 16 /// <summary> 17 /// 青铜会员 18 /// </summary> 19 public class BronzeMember : Member 20 { 21     public override void AddIntegral(int num) 22     { 23         score = score + num; 24     } 25 } 26 /// <summary> 27 /// 白银会员 28 /// </summary> 29 public class SilverMember : Member 30 { 31     public override void AddIntegral(int num) 32     { 33         score = score + num * 2; 34     } 35 } 36 /// <summary> 37 /// 游戏 38 /// </summary> 39 public class Game //隐式继承于object 40 { 41     //使用基类Member作为参数类型,可以使该参数更具通用性,因为继承的转换规则允许基类引用中保存派生类的实例,即参数generalMember可以是Member类下的所有派生类 42     public static void PlayGame(Member generalMember) 43     { 44         //进行游戏 45         //游戏结束后添加积分 46         generalMember.AddIntegral(2); 47     } 48 } 49 /// <summary> 50 /// 实现 51 /// </summary> 52 public class RealizeObject //隐式继承于object 53 { 54     public void Realize() 55     { 56         //C#允许派生类直接向基类转换,即隐式转换 57         Member bronze = new BronzeMember(); 58         Game.PlayGame(bronze); 59         //因为SilverMember派生于Member,Member派生于object,所以object可以保存SilverMember的实例 60         object silver = new SilverMember(); 61         //基类object直接向派生类Member转换会发生编译时错误(即语法验证不通过),此时如果使用对应类型的强制转换符则编译可通过 62         Game.PlayGame((SilverMember)silver); 63     } 64 }

如果silver对象的实现类型与强制转换的类型非继承关系,则在运行时会出现异常。此时处理方式除了使用结构化异常处理外,C#还提供了更加简洁和快速的方式as和is关键字。

二、as和is关键字

 1 public class GoldMember  2 {  3   4 }  5 public class RealizeObject  6 {  7     public void Realize()  8     {  9         object goldMember = new GoldMember(); 10         //is关键字检验is左边的对象是否与右边兼容,兼容则返回true,不兼容则返回false 11         if (goldMember is Member) 12         { 13             Game.PlayGame((Member)goldMember); 14         } 15         //as关键字检验as左边的对象是否与右边兼容,兼容则把对象转换成as右边的类型并返回,不兼容则返回NULL 16         Member gold = goldMember as Member; 17         if (goldMember != null) 18         { 19             Game.PlayGame(gold); 20         } 21     } 22 }

is关键字与as关键字的相同点:1、它们都为类型转换时作检查;2、它们永远不会抛出异常。

is关键字与as关键字的不同点:1、检查返回结果不一样;2、前者需要进行两次类型检查,后者需要进行一次和判断一次,性能优于前者。

is关键字适用于判断对象是否兼容某个类型,重点在判断。

as关键字适用于检查对象并转换为某个类型,重点在转换。

总结:类型转换在继承关系中,C#允许派生类直接向基类转换(隐式转换),反之如果基类直接向派生类转换会发生编译时错误(即语法验证不通过),此时如果使用对应类型的强制转换符则编译可通过(显示转换)。但如果此对象的实现类型与强制转换的类型非继承关系,则在运行时会出现异常,此时处理方式除了使用结构化异常处理外,C#还提供了更加简洁和快速的方式as和is关键字(as适于转换,is适于判断)。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!