转载-C#学习笔记-基本概念(CLR、CTS、CLS...)

1. CLR(Common Language Runtime,公共语言运行时(库))

  可由多种.NET语言使用的运行时环境,其主要作用是定位、加载和管理.NET类型、内存管理、安全检查、线程管理等。.NET运行库提供了一个定义明确的运行库层,可以被支持.NET的所有语言和平台共享。

  

2. CTS(Common Type System,公共类型系统)

  CTS是一个正式的规范,它规定了类型必须如何定义才能被CLR承载。CTS规范完整地描述了CLR所支持的所有数据类型和编程结构等,指定了这些实体之间如何交互,也规定了它们在.NET元数据中如何表示。通常只有那些设计.NET平台工具或者开发编译器的人才对CTS的内部工作非常关心,但是.NET编程人员都必须了解CTS中定义的常用类型主要有5种,以下是它们的简单介绍:

CTS类类型:

  每一种.NET语言至少要支持class type的概念,这是OOP的基础。

 CTS接口类型:

  接口是抽象成员的集合,可以理解为一些约定,可以通过一个具体的类或结构来实现这些约定。就接口本身而言并没有什么用,因为没有任何实现,但是当用具体类去实现一个给定接口时,就可以通过接口引用来实现多态。C#种接口类型使用interface关键字来定义,通常.NET接口用大写字母I开头,且声明为public,如:

public interface IDraw
{void Draw();
}

CTS结构类型:

  .NET中的结构类型可以看成是具有值语义的轻量级类类型,适用于几何和数学数据。C#中用struct关键字创建结构类型:

    struct Point{public int xPos, yPos; // 字段public Point(int x, int y) // 构造函数{xPos = x; yPos = y;}public void ShowCurrentPos() // 方法{Console.WriteLine("({0}, {1})", xPos, yPos);}}

CTS枚举类型:

// 默认每一项用32位整数存储,但是可以改变存储大小,派生自System.Enum
enum Color
{Red, // 默认从0开始,可以自定义值Green,Blue
}

CTS委托类型:

    class Program{// 委托(delegate)在.NET中等效于类型安全的C/C++函数指针,但是.NET委托是派生自System.MulticastDelegate,而不是简单的指向原始内存地址的指针delegate int BinaryOperate(int x, int y); // 该委托可以“指向”任意原型为带2个int参数并返回int的方法static void Main(string[] args){// 定义一个委托对象,指向一个LambdaBinaryOperate addop = (int x, int y) => { return x + y; };// 直接调用委托对象int ret = addop(10, 88);Console.WriteLine("ret = {0}", ret);Console.ReadKey();}}

  一个实体可以用委托向另一个实体传递调用,委托也是.NET事件的基础。

内建的CTS数据类型:

  不同的语言用于声明内建CTS数据类型的关键字一般是不同的,但是所有语言的关键字最终都将解释成定义在mscorlib.dll程序集中的相同类型。下表是CTS内建数据类型,及它们在不同.NET语言中对应的关键字:

// 各种托管语言中的关键字只是System命名空间中真实类型的简化符号,可以通过语言关键字和正式的CTS类型来定义变量
int num1 = 0;
System.Int32 num2 = 0;

3. CLS(Common Language Specification,公共语言规范)

  一种特定的.NET语言可能并不支持CTS所定义的全部特性,比如某些.NET语言可能不支持或支持指针类型。CLS是一套规则,描述了支持.NET的编译器必须支持的最小的和完全的特征集,以生成可由CLR承载的代码,同时可以被所有.NET语言用统一的方式进行访问。CLS可以看成是CTS所定义完整功能的一个子集。

  CLS比较重要的一个规则是规则1:CLS规则仅约束程序集的public部分。

    public class Calc{// public方法,不遵循CLS方法因为: 外部使用了无符号数不符合CLS约束(某些.NET语言不支持无符号数)public uint Add(uint x, uint y){return x + y;}// ok, 内部可以使用无符号数,只要对外public部分符合CLS即可public int Sub(int x, int y){uint tmpX = (uint)x, tmpY = (uint)y;return (int)(tmpX - tmpY);}}

  C#中可以使用特性来让编译器检查代码是否遵循CLS规则:

4. BCL(Base Class Library,基础类库)

  由.NET平台提供的适用于全部.NET程序语言的基础类库,封装了各种基本类型如线程、文件IO、图形绘制、硬件交互及其他的运用服务等。

  基础类库定义了一些可以创建任意类型软件运用程序的类型,如使用ASP.NET创建Web运用、使用WCF创建网络服务、使用Winows Form/WPF创建桌面GUI运用、使用ADO.NET与关系数据库交互、XML操作、文件系统交互等。

 6. 程序集基本概念

  C#编译生成的代码只能在.NET运行库中执行,这种必须在.NET运行库下执行的代码称为托管代码(managed code),包含这些托管代码的二进制单元称为程序集(assembly)。尽管.NET二进制文件与非托管的Windows二进制文件(*.dll *.exe)具有相同的文件扩展名,但是它们内部的结构是完全不同的。.NET二进制文件不包含特定于平台的指令,它包含的是平台无关的IL(Intermediate Language,中间语言,官方叫MSIL或CIL即Microsoft IL/Common IL,都是一个意思)和类型元数据。

   当使用.NET编译器生成dll或exe文件时,二进制大对象(托管模块)会被打包成一个程序集。如:C#源代码——>1个或多个托管模块(包含IL、元数据等信息)+资源/数据文件——>合并成程序集(清单描述)

   程序集包含了IL代码、元数据,它本身使用清单进行描述,清单记录了程序集当前版本信息、文化信息、以及外部引用的程序集列表等

7. IL的作用

  Native Code Compilers编译生成的都是面向特定CPU架构(如x86,x64,ARM)的代码,但是面向CLR的编译器生成的都是IL代码,IL代码也称为托管代码,因为CLR会管理它的执行。C#编译器生成的是IL代码,并不是平台相关的指令,这一点适用于所有支持.NET的编译器

  使用IL反汇编器ildasm.exe打开一个C#程序集(编译生成的exe或dll文件),并查看一个类方法如下:

  使用VB.Net编写一个同样的程序,再使用反汇编器查看其IL代码,发现是一样的:

  .NET语言源代码不直接编译成特定于平台的指令,而是编译成IL代码的2个好处:1.语言的集成性,不同的.NET语言编译器生成几乎完全相同的IL指令能够让它们很好的进行交互;2.更好地实现平台无关性。

8. 将CIL编译成特定平台的指令

  CIL(IL)指令并不是特定于平台的指令,CIL代码使用之前必须进行即时编译。将CIL代码编译成有意义的CPU机器指令的工具是CLR的JIT(just-in-time)编译器,也称为Jitter。CLR将针对各种不同CPU使用不同的JIT编译器,每个编译器都会针对底层平台进行优化。

  当给定的JIT编译器将CIL指令编译成相应的机器代码时,它会用适合目标操作系统的方式将结果缓存在内存中,这样当一个方法被调用时,则它对应的CIL指令只在第一次调用时被编译成特定平台的指令并保留在内存中以备后续使用,因此以后的调用就不需要再次编译CIL了。

9. .NET类型元数据作用

  元数据描述了每一个托管模块中定义的类型(如类、结构、枚举等)以及每个类型的成员(如字段、属性、方法、事件等)。且元数据总是与包含IL代码的文件关联,编译器同时生成元数据和IL代码,把两者绑定在一起并嵌入到最终生成的托管模块中,所以元数据和它描述的IL代码是同步的。

  元数据是许多.NET技术的基础,这些技术包括WCF、反射、迟绑定、对象序列化、垃圾回收器等。

10. 程序集清单

  .NET程序集也包含描述程序集自身的元数据,称为清单(manifest)。

11. 平台无关性

  .NET的平台无关性是通过CLI(Common Language Infrastructure,公共语言基础设施)实现的。

 

原文地址:https://www.cnblogs.com/djh5520/p/14286801.html

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

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

相关文章

2、Linux中静态IP与动态IP的修改

修改为静态IP 打开文件 sudo vim /etc/network/interfaces修改如下 # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopbackauto ens33#配置网络为DHCP模式 #iface ens33 inet dhcp#配置网络 ens33为静态IP模式 iface ens33 inet static #设置…

基于Vue+ELement搭建动态树与数据表格实现分页

基于VueELement搭建动态树与数据表格实现分页 一、前言二、左侧动态树实现2.1.后台数据接口定义2.2.前端导航菜单绑定2.3.根据数据渲染页面 3.分页 一、前言 在上一篇博文我们搭建了首页导航和左侧菜单,但是我们的左侧菜单是死数据今天我们就来把死的变成活的&#…

自学WEB后端01-安装Express+Node.js框架完成Hello World!

一、前言,网站开发扫盲知识 1.网站搭建开发包括什么? 前端 前端开发主要涉及用户界面(UI)和用户体验(UX),负责实现网站的外观和交互逻辑。前端开发使用HTML、CSS和JavaScript等技术来构建网页…

Leetcode 386. 字典序排数

文章目录 题目代码&#xff08;9.22 首刷看解析&#xff09; 题目 Leetcode 386. 字典序排数 代码&#xff08;9.22 首刷看解析&#xff09; 迭代DFS class Solution { public:vector<int> lexicalOrder(int n) {vector<int> ret(n);int number 1;for(int i 0…

Flink--6、输出算子(连接到外部系统、文件、kafka、MySQL、自定义Sink)

星光下的赶路人star的个人主页 世间真正温煦的春色&#xff0c;都熨帖着大地&#xff0c;潜伏在深谷 文章目录 1、输出算子&#xff08;Sink&#xff09;1.1 连接到外部系统1.2 输出到文件1.3 输出到Kafka1.4 输出到MySQL&#xff08;JDBC&#xff09;1.4 自定义Sink输出 1、输…

【数学建模】2023华为杯研究生数学建模F题思路详解

强对流降水临近预报 我国地域辽阔&#xff0c;自然条件复杂&#xff0c;因此灾害性天气种类繁多&#xff0c;地区差异大。其中&#xff0c;雷雨大风、冰雹、龙卷、短时强降水等强对流天气是造成经济损失、危害生命安全最严重的一类灾害性天气[1]。以2022年为例&#xff0c;我国…

vue_Delete `␍`eslint(prettier/prettier)

Delete ␍eslint(prettier/prettier) 错误的解决方案 问题背景 在Windows笔记本上新拉完代码&#xff0c;在执行pre-commit时&#xff0c;出现如下错误&#xff1a; Delete ␍eslint(prettier/prettier)问题根源 罪魁祸首是git的一个配置属性&#xff1a;core.autocrlf 由于…

MATLAB实战 | 粮食储仓的通风控制问题

粮食储仓的通风控制问题 01、应用实战 【例1】粮食储仓的通风控制问题。在粮食储备中&#xff0c;合适的湿度是保证粮食质量的前提。一般来说&#xff0c;若粮食水分的吸收和蒸发量相等&#xff0c;这个湿度称为平衡点湿度。只有实际湿度处于平衡点湿度以下&#xff0c;粮食质…

CSS笔记——基本语法及相关知识

CSS层叠样式表是用于定义 HTML 或 XML 文档的样式和布局的语言。它可以让开发者更加灵活地控制页面元素的样式和排版&#xff0c;从而提高页面的可读性和用户体验 一、css样式书写顺序和规范 CSS样式的书写顺序和规范是为了让代码更易读、易维护和易扩展。下面是一些常见的规…

【空间-光谱联合注意网络:多时相遥感图像】

A Spatial–Spectral Joint Attention Network for Change Detection in Multispectral Imagery &#xff08;一种用于多光谱图像变化检测的空间-光谱联合注意网络&#xff09; 变化检测是通过比较双时相图像来确定和评估变化&#xff0c;这是遥感领域的一项具有挑战性的任务…

MySQL强制使用索引的两种方式及优化索引,使用MySQL存储过程创建测试数据。

一、MySQL强制使用索引的两种方式 1、使用 FORCE INDEX 语句&#xff1a; explainselect*fromtbl_test force index (index_item_code)where(item_code between 1 and 1000) and (random between 50000 and 1000000)order byrandomlimit 1; 使用 FORCE INDEX&#xff08;索引…

链表(单链表、双链表)

前言&#xff1a;链表是算法中比较难理解的部分&#xff0c;本博客记录单链表、双链表学习&#xff0c;理解节点和指针的使用&#xff0c;主要内容包括&#xff1a;使用python创建链表、实现链表常见的操作。 目录 单链表 双链表 单链表 引入链表的背景&#xff1a; 先来看…

使用ElementUI结合Vue完善主页的导航菜单和书籍管理以及后台数据分页查询

目录 动态树 数据表 案列 书籍管理 动态树 动态树&#xff08;Dynamic tree&#xff09;是一种数据结构&#xff0c;它可以在树中动态地插入、删除和修改节点。与静态树不同&#xff0c;静态树的节点是固定的&#xff0c;一旦构建完成就无法再进行修改。而动态树可以在运行时…

任意文件的上传和下载

1.任意文件下载&#xff08;高危&#xff09; 定义 一些网站由于业务需求&#xff0c;往往需要提供文件查看或文件下载功能&#xff0c;但若对用户查看或下载的文件不做限制&#xff0c;则恶意用户就能够查看或下载任意敏感文件&#xff0c;这就是文件查看与下载漏洞。 可以下载…

OpenCV显示10bit Raw数据

参考&#xff1a;10 12 14bit图像存储格式&#xff0c;利用Opencv显示10bit Raw数据,并根据鼠标的移动显示对应位置的灰度值。其他bit位数的Raw数据方法类似。 代码实现&#xff1a; #include<opencv2/opencv.hpp> #include<iostream> #include<opencv/highgu…

【Vue.js】使用Element入门搭建登入注册界面axios中GET请求与POST请求跨域问题

一&#xff0c;ElementUI是什么&#xff1f; Element UI 是一个基于 Vue.js 的桌面端组件库&#xff0c;它提供了一套丰富的 UI 组件&#xff0c;用于构建用户界面。Element UI 的目标是提供简洁、易用、美观的组件&#xff0c;同时保持灵活性和可定制性 二&#xff0c;Element…

一创聚宽的实盘就要关闭了,有没有好用的实盘平台推荐

挺多的&#xff0c;比较普遍的是QMT和Ptrade&#xff0c;python语言&#xff0c;易上手&#xff0c;通用性好&#xff0c;要说适用性可以考虑Ptrade&#xff0c;问一下你的客户经理有没有&#xff0c;用Ptrade的券商也多&#xff0c;如果之前用一创聚宽你可以无缝切换&#xff…

【工具使用】Audition软件导入.sesx文件报错问题

一&#xff0c;简介 本文主要介绍了在使用Audition导入新的wav文件后&#xff0c;保存&#xff0c;然后再打开.sesx文件时报错&#xff1a;“ 错误: 文件已损坏或使用了不受支持的格式 XML FATAL ERROR: (line: 2835, col: 69) [ D:\Project\AE_Y2311\16channel_test\16_chann…

【趣味JavaScript】5年前端开发都没有搞懂toString和valueOf这两个方法!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

基于微信小程序的语言课学习系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…