C#中的is和as

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace is和as
{
    /*
     * is的作用:用于判断类型是否匹配,匹配返回ture,不匹配返回false;is操作符永远不会抛出异常。
     * 例:obj is TypeA;
     * 该行代码可确定obj是否为TypeA 或者 TypeA派生类的一个实例。
     *     
     * as的作用:用于在匹配的引用类型之间进行类型转换
     * */
    class Program
    {
        static void Main(string[] args)
        {
            #region is的用法
            ParentClass parentClass = new ParentClass();
            if (parentClass is ParentClass)
                Console.WriteLine("对象parentClass与ParentClass类型匹配");
            else
                Console.WriteLine("对象parentClass与ParentClass类型不匹配");

            ChildClass childClass = new ChildClass();
            if (childClass is ParentClass)
            {
                Console.WriteLine("对象childClass与ParentClass类型匹配");
                ParentClass p = (ParentClass)childClass;

                /*
                 * 注:
                 * 在这个if代码块内,CLR会进行两次对象类型的检查,
                 * 第一次是在is判断的时候,CLR会检查类型是否匹配;
                 * 第二次是在强制转换的时候,CLR会再次检查类型是否匹配。
                 * CLR的类型检查增强了安全性,但是对性能造成了影响。
                 * 为此,C#提供了as运算符,简化写法,提升性能。
                 * */
            }
            else
            {
                Console.WriteLine("对象childClass与ParentClass类型不匹配");
            }
            #endregion

            #region as的用法
            ParentClass pp = childClass as ParentClass;//CLR检查类型是否匹配,匹配则返回同一对象的引用,不匹配返回null。
            if (null != pp)
                Console.WriteLine("转换成功");
            else
                Console.WriteLine("转换失败");

            /*
             * 注:
             * 1.as运算符造成CLR只进行一次类型检查,所以可以提升性能。
             * 2.as运算符的工作方式与强制类型转换一样,但as不会抛出异常,因为转换失败时返回null而非抛出异常。
             * */
            #endregion

            Console.ReadLine();
        }
    }

    /// <summary>
    /// 父类
    /// </summary>
    class ParentClass
    {
        public string name = "www";
        public int age = 0;
    }

    /// <summary>
    /// 子类
    /// </summary>
    class ChildClass : ParentClass
    {
        public string tel = "911";
        public string qq = "000";
    }
}

参考资料: https://www.cnblogs.com/cgli/archive/2011/05/10/2041731.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值