zoukankan      html  css  js  c++  java
  • 为什么说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);
    
            }
    
        }

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

       

  • 相关阅读:
    UITableView全面解析
    UITableView传值(自己使用)(属性,代理传值)
    页面之间传值(单例传值)(自己使用)
    带导航栏的最简单多视图
    UIscrollView和UIPageControl的循环滚动
    UIPickerView简单应用
    自定义进度条(菜鸟版)
    UISegmentedControl(人物简介)
    UI控件闪灯
    关于NSCELL
  • 原文地址:https://www.cnblogs.com/darrenji/p/3994146.html
Copyright © 2011-2022 走看看