is操作符和as操作符比较

     is操作符在表达式可以安全地转换为“类型”而不抛出异常,结果值为true。
     as操作符则将is和转换操作结合起来,首先测试转换是否合法,如果合法则进行转换。如果不合法,as操作符返回null。使用as操作符不用处理异常。同时可以避免两次转换测试的开销。
     下面看看测试代码:
        //  接口IStorable
        interface IStorable
        {
            void Read();
            void Write(object obj);
            int Status { get;set;}
        }
        //  接口ICompressible
        interface ICompressible
        {
            void Compress();
            void DeCompress();
        }
        //  Document类只继承IStorable
        public class Document : IStorable
        {
            private int status = 0;
            public int Status
            {
                get { return status; }
                set { status = value; }
            }
            public Document(string s)
            {
                Console.WriteLine("Creating document with :{0}", s);
            }
            public void Read()
            {
                Console.WriteLine("Reading.......");
            }
            public void Write(object o)
            {
                Console.WriteLine("Writing.......");
            }
        }
        //  CompressibleDocument类继承Document,同时实现了IStorable和ICompressible接口
        public class CompressibleDocument : Document, ICompressible
        {
            public CompressibleDocument(string s)
                :
                base(s) { }
            public void Compress()
            {
                Console.WriteLine("Compressing.......");
            }
            public void DeCompress()
            {
                Console.WriteLine("DeCompress.......");
            }
        }
 
开始测试:
先使用as操作符:
static void Main(string[] args)
        {
            Document[] docArray = new Document[2];
            docArray[0] = new Document("Teat Document");
            docArray[1] = new CompressibleDocument("Test CompressibleDocument");
            foreach (Document doc in docArray)
            {
                //  报出文档名
                Console.WriteLine("Got: {0}", doc);
                IStorable isDoc = doc as IStorable;
                if (isDoc != null)
                {
                    isDoc.Read();
                }
                ICompressible icDoc = doc as ICompressible;
                if (icDoc != null)
                {
                    icDoc.Compress();
                }
            }
            Console.ReadLine();
        }
测试结果 :
 
使用is操作符:
static void Main(string[] args)
        {
            Document[] docArray = new Document[2];
            docArray[0] = new Document("Teat Document");
            docArray[1] = new CompressibleDocument("Test CompressibleDocument");
            foreach (Document doc in docArray)
            {
                //  报出文档名
                Console.WriteLine("Got: {0}", doc);
                if (doc is IStorable)
                {
                    IStorable isDoc = (IStorable)doc;       //  转换为接口
                    isDoc.Read();
                }
                if (doc is ICompressible)
                {
                    ICompressible icDoc = (ICompressible)doc;
                    icDoc.Compress();                           //Document类不会实现Compress接口
                }
            }
            Console.ReadLine();
        }
输出结果:
综合谈论:
       如果我们测试的对象的目的是确定它是否属于所需类型,并且若是的话要立即转换,as操作符效率更好。但有时候我们只是测试并不想立即转换,可能根本就不会 转换,只是在对象实现了接口时,将他加入一个列表中。这个is操作符是更好的选择。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值