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);
    
            }
    
        }

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

       

  • 相关阅读:
    找不到或无法加载主类
    Syntax error , insert “EnumBody” to complete EnumDeclaration
    The type javax.servlet.http.HttpServletRequest cannot be resolved. It is indirectly referenced from required .class files
    003 Fiddler 界面
    002 Fiddler 配置
    001 Fiddler 安装
    C++的函数重载
    001 位运算
    【纪中受难记】——C2Day2:dp不能
    连续函数的根
  • 原文地址:https://www.cnblogs.com/darrenji/p/3994146.html
Copyright © 2011-2022 走看看