• 为什么说CLR是类型安全的


    CLR总是知道托管堆上的对象是什么类型,这是CLR类型安全的前提。托管堆上的每个对象都有一个"类型对象指针",指向托管堆上Type对象的一个实例。我们总是可以通过System.Object的GetType实例方法,获取对象类型。而且,GetType是非虚方法,这样子类就不能重写该方法,子类就没有办法伪装成父类。

     

    为什么需要类型安全呢?类型伪装是许多安全漏洞的根源。CLR类型安全保证了类型的安全转换。如果类型转换失败就会报错,有些在编译期报,有些在运行时报。

     

    □ 子类转换成父类

    是隐式转换,子类就是父类,符合"里氏替换原则",不会抛出异常。

        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                Manager manager = new Manager();
    
                Employee employee = manager;
    
                Console.WriteLine(employee.Name);
    
            }
    
        }
    
        public class Employee
    
        {
    
            private int Age;
    
            public string Name;
    
        }
    
        public class Manager : Employee
    
        {
    
            private int Salary;
    
            public string Department;
    
        }
    

    子类转换成父类后,父类只能拿到父类的公共成员。从中也能体会到为什么子类转换成父类,其目的就是想使用父类的公共成员和方法。

     

    □ 父类转换成子类

    是显式转换,转换失败,在运行时会抛"InvalidCastException"异常。

        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
                Employee employee = new Employee();
    
                Manager manager = (Manager) employee;
    
                Console.WriteLine(manager.Name);
    
                Console.WriteLine(manager.Department);
    
            }
    
        }

    父类转换成子类,子类能拿到父类和子类的公共成员。

       

  • 相关阅读:
    莫队模板
    CF600E Lomsat gelral
    JZOJ 捕老鼠
    JZOJ 4896. 【NOIP2016提高A组集训第16场11.15】兔子
    JZOJ 4895【NOIP2016提高A组集训第16场11.15】三部曲
    双端队列xLIS问题
    最大K段和
    你真的了解ES6的promise吗?
    JS对象和数组深浅拷贝总结②
    当前页码删除唯一数据后加载前一页内容
  • 原文地址:https://www.cnblogs.com/darrenji/p/3994146.html
Copyright © 2020-2023  润新知