zoukankan      html  css  js  c++  java
  • 类型转换、类型安全以及is和as的使用

    class Program
        {
            static void Main(string[] args)
            {
                //1、类型转换
                {
                    //隐式转换:不需要转型,因为new返回一个Employee对象,而Object是Employee的基类型
                    object o = new Employee();
    
                    //显示转换:需要转型,因为Employee派生自Object
                    Employee employee = (Employee)o;
                }
    
                //2、类型安全
                {
                    //由于Manager是派生自Employee类型,运行正常
                    Manager m = new Manager();
                    PromoteEmployee(m);
    
                    //由于DateTime不是派生自Employee类型,运行时会抛出异常
                    //DateTime newYears = new DateTime(2019, 8, 25);
                    //PromoteEmployee(newYears);
                }
    
                //3、类型检查 is ,用is判断类型相比比较低
                /*
                 * 这是由于is操作符首先核实o是否兼容于Employee类型,再次核实o是否引用了一个Employee
                 * 
                 * is类型检查,永远不会抛出异常,结果只会返回 true  或 false
                 * 
                 * **/
                {
                    object o = new object();
                    if ((o is object))
                    {
    
                    }
                    if ((o is Employee))
                    {
    
                    }
                }
    
                //4、类型转换 as ,用as判断类型可提升其性能
                /*
                 * as 类型转换,如果类型转换成功,则返回对象,否则返回null,此转换方式也永远不会抛出异常
                 * 
                 * **/
                {
                    object o = new object();
                    Employee e = o as Employee;
                    if (e != null)
                    {
    
                    }
                }
    
                //5、类型转行 as ,测试
                {
                    object o = new object();
                    Employee e = o as Employee;
                }
    
                //6、类型转换小测试
                {
                    //编译错误,由于是显示转换,不一定成功
                    //B b1 = new object();
                    //D d1 = new object();
    
                    //运行错误,由于是显示转换,不一定成功
                    B b1 = new B();
                    D d1 = (D)b1;
    
                    //运行错误,由于是显示转换,不一定成功
                    object o = new object();
                    B b2 = (B)o;
                }
                Console.ReadKey();
            }
            //应该将Object参数类型改为Employee类型,这样在编译时就能报错
            static void PromoteEmployee(object o)
            {
                Employee e = (Employee)o;
            }
        }
        class D : B
        {
    
        }
        class B
        {
    
        }
        public class Manager : Employee
        {
        }
        public class Employee
        {
        }
  • 相关阅读:
    ov5640调试过程
    关于OnPaint函数的工作原理(很详细,很实用) [转载]
    机器视觉网络资源
    (转)signaltap II数据用于仿真
    DataSocket简介
    datasocket使用网络传输图像
    共享变量/全局变量/datasocket
    [转载] 任意频率分频原理
    [转]影响FPGA设计中时钟因素的探讨
    生产者和消费者
  • 原文地址:https://www.cnblogs.com/lishuyi/p/11408847.html
Copyright © 2011-2022 走看看