为什么说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);
}
}
父类转换成子类,子类能拿到父类和子类的公共成员。
为什么说CLR是类型安全的相关推荐
- mysql支持clr_什么是 CLR ?
什么是公共语言运行时(Common Language Runtime, CLR)?简单来说就是:公共语言运行时(CLR)是一套完整的.高级的虚拟机,它被设计为用来支持不同的编程语言,并支持它们之间的互 ...
- 《CLR via C#》笔记——CLR的执行模型
一.将源代码编译成托管代码 1, CLR(Common Language Runtime)公共语言运行时是一个可由多种语言使用的"运行时",CLR的核心功能(比如内存管理,程序集加 ...
- 跟小静学CLR via C#(12)-委托Delegate
本来按照进度应该学习事件了,可总觉得应该委托在前,事件在后,才好理解. 委托是一个类,它提供了回调函数机制,而且是类型安全的.使用委托可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数 ...
- [CLR via C#]17. 委托
原文:[CLR via C#]17. 委托 回调函数是一种非常有用的编程机制,它已经存在很多年了.Microsoft .NET Framework通过委托(delegate)来提供一种回调机制.不同于 ...
- CLR via C#深解笔记二 - 类型设计
类型基础 所有类型都从System.Object派生 CLR要求所有对象都用new 操作符来创建. Employee e = new Employee("Constructor Parame ...
- CLR via C#(17)--接口
CLR不允许继承多个基类,但是可以继承多个接口.凡是能使用具名接口类型的实例的地方,都能使用实现了接口的一个类型的实例. 接口是对一组方法签名进行了统一命名,但不提供任何实现,而具体类则必须为继承的全 ...
- [CLR via C#]12. 泛型
原文:[CLR via C#]12. 泛型 泛型(generic)是CLR和编程语言提供一种特殊机制,它支持另一种形式的代码重用,即"算法重用". 简单地说,开发人员先定义好一个算 ...
- 【CLR via C#】CSC将源代码编译成托管模块
下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...
- Chapter1 CLR的执行模式
1.1将源代码编译成托管模块 一.托管模块的各个组成部分 1.PE32或PE32+头,标准的WindowsPE文件头,如果这个头使用的是PE32格式,文件只能在32或64位系统上运行,如果头是PE32 ...
最新文章
- CentOS 5.6 快速搭建LAMP
- 【大数据系列】hadoop单节点安装官方文档翻译
- Mybatis源码之插件模块分析
- Dijkstra(狄克斯特拉)求加权重的邻接矩阵最短路径(初级版)
- java鼠标中键_java-selenium鼠标键盘操作Actions类和Robot
- Javascript特效:输入框焦点判断
- spring :cannot be resolved to absolute file path because it does not reside in the file system: jar
- Java数据库的介绍和使用
- 智能车改舵机中值步骤_智能车制作全过程(飞思卡尔---舵机篇)
- Javassist基本用法
- dmg文件 linux,Linux通过命令行建立dmg文件
- 读书笔记《深度学习与图像识别原理与实践 大白话讲解对小白易懂》2022-8-5
- PostgreSQL表增加一列或删除一列
- JAVA:实现ClosestPair最近对算法(附完整源码)
- elasticsearch插件之cerebro的安装
- Android 一键拨号
- [大数据]数据可视化 -- 练习卷(下)
- NGINX-SESSION粘滞
- 外挂、破解软件理论与实战
- Intel8086处理器使用NASM汇编语言实现操作系统04-实模式-屏幕显示不定长度的字符串(cmp/je)
热门文章
- centos7.6内核升级
- nginx升级与回退
- CentOS下Apache服务器的安装与配置
- Kippo:一款强大的SSH蜜罐工具
- shell脚本100例
- 【Python-2.7】如何判断对象是否为可迭代?
- cxf webservice:异常SOAPFaultException: Unexpected wrapper element found解决
- WebApi接口访问异常问题。尝试创建“testController”类型的控制器时出错。请确保控制器具有无参数公共构造函数
- Android App自动更新解决方案(DownloadManager)
- [转]MySQL忘记密码的正确解决方法