Keep on going never give up.

Let's Go

C# 学习笔记(1)C#中的一些基础概念

C#Lonely2019-04-23 00:00:0041次2条

C#中的一些基本概念,实际上我也不是理解的很透彻,很多时候只会去用,让我说出其中的所以然来我也回答不上来,可能是因为自己的基础知识比较薄弱吧,没有深入的理解吃透它们。先记录下来,以后可以在回头看看。

1、什么是C#?

C#是一门面向对象的编程语言,发音为C Sharp,是由微软公司开发的一种面向对象且运行于.NET Framework之上的高级程序设计语言。


2、什么是.NET Framework?

.NET Framework(.NET框架):C#是一门编程语言,它运用于实现与计算机对话,但C#编写的程序是需要编译运行的,.NET Framework就是应用程序运行时的执行环境,为程序的运行提供一下几种服务:

● 全面的类库:.NET Framework提供了丰富的类库以供调用,这样我们不必再去编写大量代码去出处理常见的操作。

● 内存管理:在许多其他的编程语言中,开发人员需要负责内存的分配与释放,以及对象生命周期的处理等任务。.NET Framework为减轻开发人员的工作,提供了内存管理服务。

● 通用类型系统 (Common Type System,CTS)CTS定义了可以在中间语言中使用的预定义数据类型。

● 开发结构和技术:.NET Framework提供了开发特定应用程序所需的库,如Web应用程序的ASP.NET技术。

● 语言的操作性:面向.NET Framework的语言编译器都提供了生成中间语言代码的机制,这种机制使不同语言之间进行互操作成为可能。


3、.NET Framework的组成

.NET Framework由公共语言运行时(Common Language Runtime,CLR)和.NET Framework类库(Framework Class Library,FCL)两部分组成。

公共语言运行时:
公共语言运行时是.NET Framework的核心基础。我们可以将CLR看成一个在执行时管理代码的代理,它提供了内存管理、线程管理和异常处理等服务,而且还负责对代码实施严格的类型安全检查,保证了代码的正确性。我们将受CLR管理的代码称为托管代码( managed code), 将不受CLR管理的代码称为非托管代码( unmanaged code )。
CLR包含两个组成部分:通用类型系统( Common Type System, CTS)和公共语言规范( Common Language Specification, CLS)。

下面来具体了解这两个组件的功能:
CTS :
C#和VB.NET都是由CLR进行管理的,但是它们的语法和数据类型各不相同,CLR是如何对这两种不同的语言进行托管的呢?这得益于CTS。CTS用于解决不同语言之间数据类型不同的问题,如C#中整型是int,而VB.NET中的型却是Integer,通过CTS可以把这两个类型变成通用类型Int32。所有.NET语言都共享CTS这一类型系统,从而使它们之间能够实现无缝互操作。

CTS类型主要分为两大类:引用类型和值类型。这两种类型之间存在着相互转化,转化方法分别为装箱(box )和拆箱( unbox)。
image.png

CLS

.NET下的语言不仅仅存在数据类型的不同,语言规范上也有显著的区别,公共语言规范(CLS)就是为了解决这个问题而诞生的。CLS是种最低的语言标准,它制定了以.NET平台为目标的语言所必须支持的最小特征,以及某一语言与其他.NET语言之间实现互操作所需要的完备特征。凡是遵守这个标准的语言,在.NET框架下都可以实现互相调用;不符合公共语言规范的代码就不能被其他语言调用,继而不能与其他语言进行互操作。比如在C#中,变量命名是区分大小写的,而VB.NET却不区分大小写,这样CLS就规定,编译后的L代码除了大小写之外必须还有其他的不同。

两者之间的区别:

png

.NET Framework类库:

.NET Framework类库就是一组DLL程序集的集合,其中包含了大量定义好的类型,这些类型都公开了一些功能。我们可以使用这些公开的功能开发出多种应用程序。由于FCL中包含了数量极多的类型,因此有必要将相关的一组类型放到一个单独的命名空间中加以区分,例如System.IO命名空间中就包含了用于执行I/O操作的类型,因此在使用FCL中的某个类时,还必须知道该类所在的命名空间。


4、C#与.NET Framework的关系

C#是面向.NET Framework的语言,除C#之外,VB.NET和F#也都是面向.NET Framework的语言。.NET Framework为这些语言提供了执行环境,这些语言则可以调用.NET Framework所提供的类库来开发各种应用程序。

image.png

5、C#代码的执行过程

C#代码的执行必须将其转换为目标操作系统能够理解的语言,即本机代码(native code),在.NET Framework平台下,该过程包括以下两个阶段:

● C#代码编译为中间语言代码的阶段——在编译C#代码时,并不是立即创建专用于操作系统的本机代码,而是由C#编译器(Visual Studio中集成了C#编译器)把代码编译为通用中间语言(Common Intermediate Language,CIL)代码。

● 中间语言代码编译为本机代码阶段——要使C#代码能够运行,还需进一步将CIL代码转为特定CPU的本机代码,该过程由即时编译器(Just-In-Time,JIT)来完成。

1、C#代码编译为中间语言代码的阶段

并不是只有C#代码才能被编译为中间语言代码,其他面向.NET的语言(如VB.NET)在执行之前也都需要先编译为中间代码。该过程由对应的编译器去完成。

png

最终创建的IL代码将存储在一个程序集中,程序集中除IL代码外,还将包括元数据和可选的资源文件。元数据用来描述代码中的类型,这种描述针对3个方面:类型定义的描述、类型成员的描述、资源引用成员的描述。可选的资源文件指IL代码中使用的其他数据,如图片文件等。

程序集分为两种:扩展名为.exe的可执行文件,以及扩展名为.dll的可供其他程序调用的库文件。

2、中间语言代码编译为本机阶段

为了使IL代码能够运行,必须把它编译为本机代码,即CPU指令。这个过程由CLR的JIT编译器来完成,其编译过程如下:

png

3、执行本机代码

JIT编译生成本机代码之后,编译好的本机代码会被放置到一个缓冲区中缓存,下次再调用相同的代码时,可直接运行缓冲区中现有的本机代码,从而避免重新验证IL代码以及把它编译为本机代码的过程。使用这种方法,系统只会在首次调用时才会造成一些性能损失(即发生JIT编译过程)。




暗锚,解决锚点偏移

文章评论

    嘿,来试试登录吧!