转载-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等技术来构建网页…

jquery相关操作--但是高级有些不太明白

jquery介绍 jQuery是目前使用最广泛的javascript函数库。据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库。微软公司甚至把jQuery作为他们的官方库。 jQuery的版本分为1.x系列和2.x、3.x系列,1.x系列兼容低版本…

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…

目标检测YOLO实战应用案例100讲-面向路边停车场景的目标检测(中)

目录 3.1.1 特征图相似度计算 3.1.2 特征图相似度实验 3.1.3 基于GhostBlock的网络结构改进

SVN -基础

SVN - 基础 概念操作步骤开发实际经验 概念 带SVN路径 有隐藏文件&#xff0c;记录repo的一些信息&#xff0c;与repo进行关联&#xff0c;可以与repo进行同步 不带SVN路径 只是单纯的文件&#xff0c;与repo独立 操作步骤 checkout 具有路径 URLcheckout dir 输出目标文件夹…

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;我国…

我的python安装在哪儿了?python安装路径怎么查?

对于 Python 开发者来说&#xff0c;Windows 系统中的 Python 安装路径是非常重要的。在本文中&#xff0c;我们将从多个方面探究如何查看 Python 安装路径&#xff0c;并提供代码示例。 一、使用文件浏览器查看 Python 安装路径 在 Windows 系统中&#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;这是遥感领域的一项具有挑战性的任务…

Java基础——运算符表达式

文章目录 算术运算符赋值运算符关系运算符逻辑运算符位运算符三元运算符 算术运算符 运算符说明加-减*乘/除%取模&#xff08;取余&#xff09;自增- -自减 参考代码&#xff1a; //加法运算 int add1 2 3; System.out.println("加法运算 add1 " add1); Strin…

debian中vim的使用

debian使用vi中经常出现m apt install vim vim不能用鼠标粘贴 vim /etc/vim/vimrc 在末尾加入以下内容&#xff1a; let skip_defaults_vim 1 if has(mouse)set mouse-a endif保存文件即可

Git 精简快速使用

安装 Git 忽略&#xff0c;自行搜索 新建项目&#xff0c;或者在仓库拉取项目&#xff0c;进入到项目目录 Github 给出的引导&#xff0c;新项目和旧项目 echo "# testgit" >> README.md git init git add README.md git commit -m "first commit"…

.NET Nuget包推荐安装

文章目录 前言通用WPFWebApiBlazor 前言 我这里的包主要是.NET Core的&#xff0c;.NET Framework可能不支持。 通用 Newtonsoft.Json&#xff1a;最常用的C#和Json对象互转的包。支持匿名对象&#xff0c;但是不支持Enum枚举类型&#xff0c;显示的是Enum的数值&#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;索引…

ARM 和 AMD 架构的区别

ARM 架构和 AMD 架构是两种不同的计算机处理器架构&#xff0c;它们有以下几个主要区别&#xff1a; 设计出发点&#xff1a; ARM 架构&#xff1a;ARM 架构最初是为嵌入式系统设计的&#xff0c;旨在提供低功耗和高效能的解决方案。它主要应用于移动设备、嵌入式系统和物联网设…