为什么说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);
        }
    }

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

   

原文地址:https://www.cnblogs.com/darrenji/p/3994146.html