当前位置:首页 > C#教程 > C#高级

C#类型转换

一、类型转换

先介绍两个前置知识:

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

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

 

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

/// <summary>

/// 会员

/// </summary>

public abstract class member //隐式继承于object

{

    /// <summary>

    /// 积分

    /// </summary>

    protected int score;

    /// <summary>

    /// 添加积分

    /// </summary>

    /// <param name="num"></param>

    public abstract void addintegral(int num);

}

/// <summary>

/// 青铜会员

/// </summary>

public class bronzemember : member

{

    public override void addintegral(int num)

    {

        score = score + num;

    }

}

/// <summary>

/// 白银会员

/// </summary>

public class silvermember : member

{

    public override void addintegral(int num)

    {

        score = score + num * 2;

    }

}

/// <summary>

/// 游戏

/// </summary>

public class game //隐式继承于object

{

    //使用基类member作为参数类型,可以使该参数更具通用性,因为继承的转换规则允许基类引用中保存派生类的实例,即参数generalmember可以是member类下的所有派生类

    public static void playgame(member generalmember)

    {

        //进行游戏

        //游戏结束后添加积分

        generalmember.addintegral(2);

    }

}

/// <summary>

/// 实现

/// </summary>

public class realizeobject //隐式继承于object

{

    public void realize()

    {

        //c#允许派生类直接向基类转换,即隐式转换

        member bronze = new bronzemember();

        game.playgame(bronze);

        //因为silvermember派生于member,member派生于object,所以object可以保存silvermember的实例

        object silver = new silvermember();

        //基类object直接向派生类member转换会发生编译时错误(即语法验证不通过),此时如果使用对应类型的强制转换符则编译可通过

        game.playgame((silvermember)silver);

    }

}

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

 

二、as和is关键字

public class goldmember

{

}

public class realizeobject

{

    public void realize()

    {

        object goldmember = new goldmember();

        //is关键字检验is左边的对象是否与右边兼容,兼容则返回true,不兼容则返回false

        if (goldmember is member)

        {

            game.playgame((member)goldmember);

        }

        //as关键字检验as左边的对象是否与右边兼容,兼容则把对象转换成as右边的类型并返回,不兼容则返回null

        member gold = goldmember as member;

        if (goldmember != null)

        {

            game.playgame(gold);

        }

    }

}

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

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

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

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

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


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!