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

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

为什么说CLR是类型安全的相关推荐

  1. mysql支持clr_什么是 CLR ?

    什么是公共语言运行时(Common Language Runtime, CLR)?简单来说就是:公共语言运行时(CLR)是一套完整的.高级的虚拟机,它被设计为用来支持不同的编程语言,并支持它们之间的互 ...

  2. 《CLR via C#》笔记——CLR的执行模型

    一.将源代码编译成托管代码 1, CLR(Common Language Runtime)公共语言运行时是一个可由多种语言使用的"运行时",CLR的核心功能(比如内存管理,程序集加 ...

  3. 跟小静学CLR via C#(12)-委托Delegate

    本来按照进度应该学习事件了,可总觉得应该委托在前,事件在后,才好理解. 委托是一个类,它提供了回调函数机制,而且是类型安全的.使用委托可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数 ...

  4. [CLR via C#]17. 委托

    原文:[CLR via C#]17. 委托 回调函数是一种非常有用的编程机制,它已经存在很多年了.Microsoft .NET Framework通过委托(delegate)来提供一种回调机制.不同于 ...

  5. CLR via C#深解笔记二 - 类型设计

    类型基础 所有类型都从System.Object派生 CLR要求所有对象都用new 操作符来创建. Employee e = new Employee("Constructor Parame ...

  6. CLR via C#(17)--接口

    CLR不允许继承多个基类,但是可以继承多个接口.凡是能使用具名接口类型的实例的地方,都能使用实现了接口的一个类型的实例. 接口是对一组方法签名进行了统一命名,但不提供任何实现,而具体类则必须为继承的全 ...

  7. [CLR via C#]12. 泛型

    原文:[CLR via C#]12. 泛型 泛型(generic)是CLR和编程语言提供一种特殊机制,它支持另一种形式的代码重用,即"算法重用". 简单地说,开发人员先定义好一个算 ...

  8. 【CLR via C#】CSC将源代码编译成托管模块

    下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...

  9. Chapter1 CLR的执行模式

    1.1将源代码编译成托管模块 一.托管模块的各个组成部分 1.PE32或PE32+头,标准的WindowsPE文件头,如果这个头使用的是PE32格式,文件只能在32或64位系统上运行,如果头是PE32 ...

最新文章

  1. CentOS 5.6 快速搭建LAMP
  2. 【大数据系列】hadoop单节点安装官方文档翻译
  3. Mybatis源码之插件模块分析
  4. Dijkstra(狄克斯特拉)求加权重的邻接矩阵最短路径(初级版)
  5. java鼠标中键_java-selenium鼠标键盘操作Actions类和Robot
  6. Javascript特效:输入框焦点判断
  7. spring :cannot be resolved to absolute file path because it does not reside in the file system: jar
  8. Java数据库的介绍和使用
  9. 智能车改舵机中值步骤_智能车制作全过程(飞思卡尔---舵机篇)
  10. Javassist基本用法
  11. dmg文件 linux,Linux通过命令行建立dmg文件
  12. 读书笔记《深度学习与图像识别原理与实践 大白话讲解对小白易懂》2022-8-5
  13. PostgreSQL表增加一列或删除一列
  14. JAVA:实现ClosestPair最近对算法(附完整源码)
  15. elasticsearch插件之cerebro的安装
  16. Android 一键拨号
  17. [大数据]数据可视化 -- 练习卷(下)
  18. NGINX-SESSION粘滞
  19. 外挂、破解软件理论与实战
  20. Intel8086处理器使用NASM汇编语言实现操作系统04-实模式-屏幕显示不定长度的字符串(cmp/je)

热门文章

  1. centos7.6内核升级
  2. nginx升级与回退
  3. CentOS下Apache服务器的安装与配置
  4. Kippo:一款强大的SSH蜜罐工具
  5. shell脚本100例
  6. 【Python-2.7】如何判断对象是否为可迭代?
  7. cxf webservice:异常SOAPFaultException: Unexpected wrapper element found解决
  8. WebApi接口访问异常问题。尝试创建“testController”类型的控制器时出错。请确保控制器具有无参数公共构造函数
  9. Android App自动更新解决方案(DownloadManager)
  10. [转]MySQL忘记密码的正确解决方法