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

news2024/11/24 9:50:51

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)
        {
            // 定义一个委托对象,指向一个Lambda
            BinaryOperate 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.coloradmin.cn/o/1043929.html

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

相关文章

【萌新的RiscV学习之流水线结构的概述-7】

萌新的RiscV学习之流水线结构的概述-7 之前写完了单周期的指令 目前朝着流水线迈进 由于涉及学业机密 就不展示代码了 主要展示学习过程和一些想法 由于时钟周期必须满足所有指令中最坏的情况,所以不能使用那些缩短常用指令执行时间而不改变最坏情况的实现技术。因…

一键导入照片就能转成电子相册?

每次旅行、每个瞬间,都值得被珍藏。无论是生日、聚会还是旅行,这款神器都能帮你记录下美好瞬间。你只需要上传照片,选择几个模板,就能在几分钟内拥有一本精美的电子相册! 首先这个神器叫做FLBOOK制作3D仿真翻页电子杂志…

VMware CentOS7 忘记root密码如何更改

VMware CentOS7 忘记root密码如何更改 1、进来的页面马上点上下键停止自动进入 (Immediately click the up and down buttons on the incoming page to stop automatic entry) 2、点键盘e键进入编辑页面e (Click the keyboard e key to en…

基于51单片机气体检测报警系统-proteus仿真-源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、MQ5采集气体值送到液晶1602显示。 3、按键设置报警阀值,声光报警。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 void init_1602() //初始化 { lcdwc(0x01); lcdwc(0x38)…

ArcGIS实战教程

ArcGIS实践教程(1)通过ArcMap把mxd格式转换为dwg格式 ArcGIS实践教程(2)ArcMap将excel数据转换为shp ArcGIS实践教程(3)ArcMap导入Excel属性数据 ArcGIS实践教程(4)利用ArcGIS进行…

NPDP证书,为什么这么多人考?

NPDP证书至2016年引进国内,考试人数就持续增长,不仅是新产品开发唯一 的职业证书,在产品管理这一领域的知名度也在前列,那么这个证书的作用在哪里呢? 想考npdp证书,npdp干货可下载: 1、就业范围…

YOLOV1论文精度

YOLOV1:You only look once 1.介绍 1.1 简介: 传统的目标检测算法如R-CNN都是先生成候选框,然后在分类器上进行分类,由于每个部分都是分开训练,所以很难去优化而且速度比较慢。而yolov1把目标检测当成一个回归问题&…

2023年融资融券费率最低的证券公司,佣金万一,融资利率5%永久

2023年信用账户新开户,融资利率最低5%,专项融券2.99%起! 了解融资利息之前先看看融资融券业务开通要求: ①在任意券商交易时间满半年。 ②在开户券商连续20个交易日日均资产超过50W。如:账户保持100w,只需要10个交易日…

消息中间件(二)——kafka

文章目录 Apache Kafka综述什么是消息系统?点对点消息类型发布-订阅消息类型 什么是Kafka?优点关键术语Kafka基本原理用例 Apache Kafka综述 在大数据中,会使用到大量的数据。面对这些海量的数据,我们一是需要做到能够收集这些数据&#xf…

【HCIE】10.EVPN

VPLS技术,公共网络中的一个L2VPN VPN一共有8种类,三大属性是:MPLS(IP),L2(L3),P2P(P2MP) MPLS VPN的属性是:MPLS,L3,P2MP VPLS和EVPN的属性是:MPLS L2 P2MP L3vpn是两个不在同一网段的网络互通 L2vpn是…

【必看】自动化测试:selenium(环境部署和元素定位)

一、什么是selenium? > 一个web自动化测试工具; 二、主流的自动化工具: > QTP:收费 支持(支持web、桌面软件自动化) > selenium:免费,开源 只支持web项目 > Robot frameword: 基于Python扩…

VM装Windows虚拟机扩容

1.进入服务器CMD模式,输入diskpart,回车 2.查看卷 list volume 3.指定扩容的磁盘 select volume 1 4.查看磁盘 list disk 5.查看逻辑分区 list parttition 6.选择需要扩展的逻辑分区 select partition 1 7.扩展 extend 8.退出并查看磁盘大小

Linux系统离线安装Python

目录 一、简介 二、前提准备 三、下载Python源码 四、将离线python包传输到Linux主机 五、编译以及创建软链接 一、简介 由于工作原因,我们经常会在内网环境下使用Linux,不过这样会让我们安装一些软件变得困难,例如需要安装Python。虽然…

工业静电控制ESD防静电手环监控看板的优势

在现代工业生产中,静电问题一直是令人头痛的难题。静电不仅会对产品质量造成严重影响,还可能导致设备故障和生产线停工。为了解决这一问题,一种新型的防静电监测系统应运而生——ESD防静电手环监控看板。该系统采用全自动智能测量、预警和提示…

2023《生信知识库》订阅

写在前面 自2021年11月末,我们开始通过《小杜的生信笔记》分享自己的学习笔记。我们的教程也受到很多同学的关注。我们的分享主要基于小杜自己的学习笔记,如画图,分析等。在知乎中,我们推出一期R语言绘图总汇https://zhuanlan.zhi…

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

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

2023-9-26 JZ22 链表中倒数最后k个结点

题目链接:链表中倒数最后k个结点 import java.util.*;/** public class ListNode {* int val;* ListNode next null;* public ListNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xf…

多协议远程管理 Termius for Mac中文

Termius是一款功能全面、易于使用的远程访问和SSH客户端软件,提供了许多有用的功能和工具,适用于开发人员、系统管理员和网络工程师等需要远程管理和访问服务器的用户。 跨平台支持:Termius可在多个操作系统上运行,包括Windows、…

autojs项目搭建和入门实践

Auto.js 是一款无需root权限的javascript自动化软件,它可以帮助用户在手机上自动执行各种任务,比如自动填写表单、自动点击按钮、自动切换应用等,并且可以通过图形用户界面来管理和编辑脚本。 软件环境 操作系统:win10 VSCODE&…

seata的启动与使用

1 下载seata 下载地址:https://github.com/seata/seata/releases/v0.9.0/ 1.1 修改配置文件 将下载得到的压缩包进行解压,进入conf目录,调整下面的配置文件: registry.conf registry {type "nacos"nacos {serverA…