博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么说CLR是类型安全的
阅读量:6575 次
发布时间:2019-06-24

本文共 906 字,大约阅读时间需要 3 分钟。

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

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

   

转载地址:http://qbgjo.baihongyu.com/

你可能感兴趣的文章
从JDK源码角度看Short
查看>>
解密Angular WebWorker Renderer (二)
查看>>
parceljs 中文文档24小时诞生记
查看>>
五年 Web 开发者 star 的 github 整理说明
查看>>
Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo
查看>>
ReactNative字体大小不随系统字体大小变化而变化
查看>>
中台之上(五):业务架构和中台的难点,都是需要反复锤炼出标准模型
查看>>
为什么中台是传统企业数字化转型的关键?
查看>>
使用模板将Web服务的结果转换为标记语言
查看>>
inno setup 打包脚本学习
查看>>
php 并发控制中的独占锁
查看>>
从pandas到geopandas
查看>>
用express搭建网站
查看>>
如何在 Swift 中进行错误处理
查看>>
[Leetcode] Factor Combinations 因数组合
查看>>
用tinypng插件创建gulp task压缩图片
查看>>
APM终端用户体验监控分析(下)
查看>>
React Native 0.20官方入门教程
查看>>
JSON for Modern C++ 3.6.0 发布
查看>>
Tomcat9.0部署iot.war(环境mysql8.0,centos7.2)
查看>>