• C#类型转换


    一、类型转换

    先介绍两个前置知识:

    一是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适于判断)。

  • 相关阅读:
    2-7-配置iptables防火墙增加服务器安全
    2-6-搭建无人执守安装服务器
    2-4-搭建FTP服务器实现文件共享
    第一阶段连接
    在mfc中如何显示出系统时间
    关于const
    第三章类图基础
    算法分析的数学基础
    第十二章 派生类
    学好C++该看什么书呢?
  • 原文地址:https://www.cnblogs.com/yaojieyuan/p/11614505.html
Copyright © 2020-2023  润新知