CLR学习

视频链接:《CLR十分钟》系列之CLR运行模型_哔哩哔哩_bilibili

什么是 CLR

公共语言运行时(Common Language Runtime CLR) 是一个可有多种编程语言使用的 运行时,CLR 的核心功能(比如 内存管理,程序集加载,安全性,异常处理和线程同步)可由面向 CLR 的所有语言使用

只要编译器是面向CLR的,CLR根本不关心开发人员使用的哪种语言

无论选择哪个编译器,结果都是托管模块

程序集

程序集是什么?CLR实际不和模块工作,它和程序集工作。程序集(assembly)是抽象概念。程序集是一个或多个模块/资源文件的逻辑性分组,其次,程序集是重用,安全性以及版本控制的最小单元。取决于你选择的编译器或工具,即可生成单文件程序集,也可生成多文件程序集。在CLR的世界中,程序集相当于组件

JIT即时编译

托管程序集同时包含元数据和IL,IL 是与CPU无关的语言。注意,高级语言通常指公开了CLR全部功能的一个子集,然而,IL汇编语言允许开发人员访问 CLR 的全部功能。所以,如果你选择的变成语言隐藏了你迫切需要的一个CLR功能,为了执行方法,首先必须把方法的IL转换成本机CPU指令,这是CLR的JIT编译器的职责

查看反编译代码

工具:ildasm.exe

Syetem.Object

//隐式派生自Object
class Employee {...}
//显式派生自Object
class Employee : System.Object {...}

system .object 的公共方法

System.Object 的受保护方法

如何新建一个对象

CLR 要求所有对象使用 new 操作符创建

Employee e = new Employee("ConstructorParam")

new 操作符做的事情:

  • 计算类型及其所有基类型(一直到 System.Object,虽然它没有定义自己的实例字段)中定义的所有实例字段需要的字节数。堆上每个对象都需要一些额外的成员,包括类型对象指针同步块索引,CLR利用这些成员管理对象,额外成员的字节数要计入对象大小
  • 从托管堆中分配类型要求的字节数,从而分配对象的内存,分配的所有字节都设为零(0)
  • 初始化对象的类型对象指针和同步块索引
  • 调用类型的实例构造器,传递在 new 调用中指定的实参。大多数编译器都在构造器中自动生成代码来调用基类构造器,每个类型的构造器都负责初始化该类型定义的实例字段,最终调用 System.Object 的构造器,该构造器什么都不做,简单的返回

new 执行了所有这些操作之后,返回指向新建对象一个引用(或指针)

没有和 new 操作符对应的 delete 操作符,没有办法显式释放对象分配的内存,CLR采用了垃圾回收机制

类型转换

开发人员经常需要将一种类型转换成另一种类型。CLR允许将对象转换成它的(实际)类型或者它的任何基类型

在 C# 语言中进行类型转换的操作符 is as,is 检查对象是否兼容于指定类型,返回 Boolean,is 操作符永远不会抛出异常

if (o is Employee) {Employee e = (Employee) o;//CLR时间检查两次对象类型,is 操作符首先核实 o 是否兼容于 Employee 类型//如果是,在 if 内部转型时,CLR 再次核实 o 是否引用一个 Employee ,CLR
//的类型检查增强了安全性,但是会影响性能。
//这是因为 CLR 首先必须判断变量 o 引用的对象的是基类型,然后CLR 必须遍历继承层次结构,
//用每个基类型去核对指定的类型
as 操作符可以简化这种代码写法并提升性能
Employee e = o as Employee;
if(e != null) { ... }

as 操作符的工作方式与强制类型转换一样,只是它永远不抛出异常

类型,对象,线程栈和托管堆在运行时的关系

只包含值类型的调用模型

线程创建时会分配到 1M 的栈空间,内存地址从高位到低位扩建

堆是从低位到高位扩建

基元类型,值类型和引用类型

什么是基元类型

编译器直接支持的数据类型称为基元类型(primitive type),基元类型直接映射到Framework类库(FCL)中存在的类型。例如,C# 的 int 直接映射到System.Int32 类型

以下这4行代码都能正确编译并生成完全相同的IL

C# 中int 始终映射到 System.Int32,所以不管在什么操作系统上运行,代表的都是 32 位整数

C#进行精度丢失的转换时总是对结果进行截断而不是向上取整

checked 和 unchecked

//程序员可以在代码的特定区域空间溢出检查
//C# 通过 checked 和 unchecked 操作符来提供这种灵活性
UInt32 invalid = unchecked((UInt32)(-1)); //OKByte b = 100;
b = checked((Byte)(b + 200)); // 抛出OverflowException异常checked {Byte b = 100;b = (Byte)(b + 200); //该表达式会进行溢出检查
}

还是得看书学,看视频就是浅尝辄止,学无止境,还有一堆东西等着我学,有缘再见吧,CLR via C#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/302382.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.JS多线程PromisePool之promise-pool库实现

什么是Promise Pool Map-like, concurrent promise processing for Node.js. Promise-Pool是一个用于管理并发请求的JavaScript库,它可以限制同时进行的请求数量,以避免过多的请求导致服务器压力过大。使用Promise-Pool可以方便地实现对多个异步操作的并…

HarmonyOS 开发-使用SideBarContainer侧边栏淡入淡出动效实现案例

介绍 在2in1或平板上,群聊侧边栏是一种较为常用的功能,虽然HarmonyOS已经具备了基本的动效,但是部分情况下开发者可能有定制侧边栏动效的需求,本例主要介绍了如何基于显式动画实现侧边栏的淡入淡出动效。 效果图预览 使用说明&a…

C#中值类型与引用类型的存储

目录 值对象与引用对象的存储 引用对象的成员存储 值对象与引用对象的存储 数据项的类型定义了存储数据需要的内存大小及组成该类型的数据成员。类型还决定了对象在内存中的存储位置——栈或堆。 C#中类型分为两种:值类型和引用类型,这两种类型的对象…

天机学堂踩坑笔记

相关资源链接: Md笔记:蓝奏云地址 在线笔记:飞书笔记地址 相关视频教程及配套课件: 链接:百度云地址 提取码:hmz1 1. Day01 初识项目 1.1 OpenEuler 22.03LTS yum换源失败 适用于OpenEuler版本为22.03LT…

1.Hexo安装和环境搭建引导

Hexo是一个依赖于一个名为nodejs的程序 因此安装它的方式在Mac和Windows上实际上是一样的 为了在电脑上安装Hexo 需要做两件事 nodejs,基本上是hexo依赖运行的JavaScript框架 Node.js — Run JavaScript Everywheregit,是一个程序,用来管理电…

BurpSuite保姆级教程

Burp Suite下载,破解,代理web,代理模拟器 (一)为Burp Sutie下载运行执行脚本环境(Java) 1.Java官网下载地址:https://www.oracle.com/java/technologies/ 下载Java SE 17.0.8(LTS) 备注:1.2023版Burp Suite 完美的运行脚本的环境是Java17 2.Java8不支持…

数据仓库实践

什么是数据仓库? 数据仓库是一个用于存储大量数据并支持数据分析与报告的系统。它通常用于集成来自不同来源的数据,提供一个统一的视图,以便进行更深入的分析和决策。 数据仓库的主要优势? 决策支持:为企业决策提供可靠…

2024年,AIGC如何渗透我的生活?

本篇博文列举本人最常用的 6 款app中 AIGC 发挥的功能及作用。 Cursor 作为一名科研工作者,平时最常用的软件就是代码编写工具。Cursor内置的Chat功能,可以辅助完成代码编辑,随时随地实现ChatGPT私有化。 Grammarly 可用于Word和Overleaf等…

vue快速入门(三)差值表达式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 插值表达式基本用法插值表达式常用公式 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

Jmeter针对多种响应断言的判断

有时候response返回的结果并非一种&#xff0c;有多种&#xff0c;需要对这几种进行判断的时候需要使用Bean Shell。 &#xff08;1&#xff09;首先获取响应数据 String response prev.getResponseDataAsString(); ResponseCode 响应状态码 responseHeaders 响应头信息 res…

c++的学习之路:17、stack、queue与priority_queue

摘要 本文主要是介绍一下stack、queue、priority_queue的使用以及模拟实现&#xff0c;文章末附上代码以及思维导图。 目录 摘要 一、stack的介绍和使用 1、stack的介绍 2、stack的使用 3、stack的模拟实现 二、queue的介绍和使用 1、queue的介绍 2、queue的使用 3、…

每日一题:矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]使用两个标记变量。 class Sol…

2024HW --->反序列化漏洞!

对于反序列化&#xff0c;这个漏洞也是常用的&#xff0c;不过涉及到的方面非常非常广&#xff0c;比其他漏洞也难很多 于是本篇文章就分成PHP和JAVA的反序列化来讲讲 1.反序列化 想要理解反序列化&#xff0c;首先就要理解序列化 序列化&#xff1a;把对象转换为字节序列的过…

模拟memcpy和memmove

memcpy是内存复制函数&#xff0c;原型如下 void *memmove(void *dest, const void *src, size_t count) 从src地址复制count个字节到dest 模拟实现 void *memcpy(void *dest, const void *src, size_t count) {if (dest NULL || src NULL)return NULL;void *ans dest;f…

操作系统知识

根据希赛相关视频课程汇总整理而成&#xff0c;个人笔记&#xff0c;仅供参考。 操作系统概述 *进程管理 进程&#xff1a;程序在一个数据集合上运行的过程&#xff0c;它是系统进行资源分配和调度的一个独立单位。由程序块、进程控制块&#xff08;PCB&#xff09;和数据块三…

【Unity灶台】食品加工系统模型搭建

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-航班时间

#include<iostream> using namespace std;int getTime(){int h1, h2, m1, m2, s1, s2, d 0;//d一定初始化为0&#xff0c;以正确处理不跨天的情况 scanf("%d:%d:%d %d:%d:%d (%d)", &h1, &m1, &s1, &h2, &m2, &s2, &d);return d …

贪心算法|135.分发糖果

力扣题目链接 class Solution { public:int candy(vector<int>& ratings) {vector<int> candyVec(ratings.size(), 1);// 从前向后for (int i 1; i < ratings.size(); i) {if (ratings[i] > ratings[i - 1]) candyVec[i] candyVec[i - 1] 1;}// 从后…

Redis中的复制功能(三)

复制 服务器运行ID 除了复制偏移量和复制积压缓冲区之外&#xff0c;实现部分重同步还需要用到服务器运行ID(run ID): 1.每隔Redis服务器&#xff0c;不论主服务器还是从服务&#xff0c;都会有自己的运行ID2.运行ID在服务器启动时自动生成&#xff0c;由40个随机的十六进制…

算法刷题Day28 | 93.复原IP地址、78.子集、90.子集II

目录 0 引言1 复原IP地址1.1 我的解题 2 子集2.1 我的解题 3 子集II3.1 我的解题 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;算法刷题Day28 | 93.复原IP地址、78.子集、90.子集II❣️ 寄语&#xff1a…