C#高级特性及项目实战Day1
.Net Framework
MSDN的解释:NET Framework是为其运行的应用程序提供各种服务的托管执行环境,它包括两个主要组件:作为处理运行的应用程序的执行引擎的公共语言运行时(CLR),以及.NET Framework类库 此类库提供开发人员可从起自己应用程序中调用的已测试的可重用代码库
CLR是.NET Framework的核心
CLR的核心是CTS和CLS 任何编程语言 如果想要在.NET CLR上执行,就必须提供一个编译器,
将此语言的程序编译成.NET CLR所认识的metadata以及IL 符合CTS的规定
CTS是通用类型系统(Common Type System)
CLS是公共语言定义(Common Language Specification)
CLR是公共语言运行时(Common language runtime)
公告语言规范CLS
CLR集成了很多种语言,它们之间可以相互访问,是因为CLR建立的标准的类型集、元数据、公共执行环境。由于各种语言间存在着极大的差别,如区分大小写,有的不支持 unsigned、操作符重载或者参数可变的方法,所以要想创建这种让别的语言能访问的程序,自己所用的编程语言只能使用其它语言都支持的那些特性。为了帮助我们更好的做到这一点,Microsoft定义了一个"公共语言规范(Common Language Specification,CLS)"
CTS定义了一组语言编译器必须遵循的规则,以定义、引用、使用和存储引用类型和值类型。因此,遵循CTS,在不同语言中编写的对象才能彼此交互。但并不是所有的类型都可以用于所有的语言。
Language complier:语言编译器,每种语言基于.net的语言都会有一个面向CLR的托管模块,也可以理解为语言编译器,把对应的语言编译成MSIL
MSIL:微软中间语言,CLR负责把中间语言编译成为执行程序的计算机可以理解的语言,是一种介于介于高级语言和汇编语言的伪汇编语言.
JIT(Just In-Time compile):即时编译,将MSIL解释为程序可以理解的语言.
1、将源代码(vb、cs)编译成 托管代码块。托管代码块由中间语言和元数据组成。
2、将托管代码合并成程序集,也叫组件(dll)。程序集中包含了一张叫做“清单”的模块,
记录了构成程序 集模块构成的信息包括资源文件及需要引用自己的信息。
3、加载公共语言运行库。
4、执行程序集的代码。
5、生成本地代码。
CLI,公共语言基础架构(Common Language Infrastructure)
CLI是一个开放的技术规范。它是由微软联合惠普以及英特尔于2000年向ECMA倡议的。通用语言基础架构定义了构成.NET Framework基础结构的可执行码以及代码的运行时环境的规范,它定义了一个语言无关的跨体系结构的运行环境,这使得开发者可以用规范内定义的各种高级语言来开发软件,并且无需修正即可将软件运行在不同的计算机体系结构上。CLI有时候会和CLR混用。但严格意义上说,这是错误的。因为CLI是一种规范,而CLR则是对这种规范的一个实现。
欧洲计算机制造商协会(ECMA)已经于2001年10月13日批准C#语言规范(ECMA-334)成为一种新诞生的计算机产业标准。同时国际标准组织ISO也同意该标准进入该组织的审批阶段。并且,作为.NET与CLR的核心部分,CLI与C#也同时获得了ECMA的批准(ECMA-335)。拥有了C#与CLI这两项标准,你可以自己写出能够运行于任何操作系统上的.NET平台(只要你愿意)。如前所述,著名的MONO项目就是这么干的,MONO项目包括三个核心的部分:一个C#语言的编译器,一个CLI和一个类库
BCL,基础类库(Base Class Library)
BCL是一个公共编程框架,称为基类库,所有语言的开发者都能利用它。是CLI(Common Language Infrastructure,公共语言基础结构)的规范之一,主要包括:执行网络操作,执行I/O操作,安全管理,文本操作,数据库操作,XML操作,与事件日志交互,跟踪和一些诊断操作,使用非托管代码,创建与调用动态代码等,粒度相对较小,为所有框架提供基础支持。
FCL,框架类库(Framework Class Library)
FCL提供了大粒度的编程框架,它是针对不同应用设计的框架 ,FCL大部分实现都引用了BCL,例如我们常说的开发框架:ASP.NET、MVC、WCF和WPF等等,提供了针对不同层面的编程框架 。
1、托管代码就是Visual Basic .NET和C#编译器编译出来的代码,托管代码在公共语言运行库(CLR)中运行
2、非托管代码是运行在公共语言运行库环境(CLR)的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务
区别:
1、托管代码是一种中间语言,运行在CLR上;
非托管代码被编译为机器码,运行在机器上。
2、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;
非托管代码依赖于平台和语言。
3、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作;
非托管代码需要自己提供安全检测、垃圾回收等操作。
4、.Net有很多非托管的资源,比如StreamWriter、 Timer、数据库连接。
unsafe可以用来修饰类、类的成员函数、类的全局变量,但不能用来修饰类成员函数内的局部变量
在公共语言运行时 (CLR) 中,不安全代码是指无法验证的代码。 C# 中的不安全代码不一定是危险的;只是其安全性无法由 CLR 进行验证的代码。 因此,CLR 只对在完全受信任的程序集中的不安全代码执行操作。 如果使用不安全代码,由您负责确保您的代码不会引起安全风险或指针错误
运行unsafe ,需要设置:
单击“配置属性”文件夹。
单击“生成”属性页。
修改“允许不安全代码块”属性
什么是GC?
GC(Garbage Collector)如其名,就是垃圾收集,这里仅就内存而言。
GC工作的原理:GC遍历应用程序在Heap(堆)上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用,已经不再被应用程序所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。
.NET的GC机制两个问题:
首先,GC并不是能释放所有的资源。它不能自动释放非托管资源。
第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性
GC并不是实时性的,这会造成系统性能上的瓶颈和不确定性。所以有了IDisposable接口,IDisposable接口定义了Dispose方法,这个方法用来供程序员显式调用以释放非托管资源。使用using语句可以简化资源管理
GC.Collect() 方法 作用:强制进行垃圾回收
元数据:是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件 (PE) 文件或存储在内存中的程序进行描述。将您的代码编译为 PE 文件时,便会将元数据插入到该文件的一部分中,而将代码转换为 Microsoft 中间语言 (MSIL) 并将其插入到该文件的另一部分中。在模块或程序集中定义和引用的每个类型和成员都将在元数据中进行说明。当执行代码时,运行库将元数据加载到内存中,并引用它来发现有关代码的类、成员、继承等信息。
元数据存储以下信息:
程序集的说明
类型的说明
属性
框架体系运行概述:
首先编写的C#源文件hello.cs通过C#编译器进行编译,编译成.NET 的PE文件结构,也就是exe文件格式,当程序运行时,Windows的Loader加载器不会负责该程序的内存分配,线程管理等工作,而是只负责跳转到CLR的执行引擎(EE)中,将控制权交由CLR,由CLR进行分配内存,线程管理,异常处理等。
1.IL/MSIL/CIL Microsoft Intermediate Language)微软中间语言(IL是MSIL的缩写,译为中间语言)
2.CTS (Common Type System)通用类型系统
3.CLS (Common Language Specification)公共语言规范
4.CLR (Common Language Runtime)公共语言运行时(也有的叫公共语言运行库)
5.JIT (Just in time)即时编译器
6.CLI 公共语言基础架构(Common Language Infrastructure)
7. BCL 基础类库(Base Class Library)
8. FCL 框架类库(Framework Class Library)