基础系列(1)—— NET框架及C#语言
一、在.NET之前的编程世界
C#语言是在微软公司的.NET框架上开发程序而设计的,首先作者给大家纠正了一下C#的正确发音:See Sharp
(一) 20世纪90年代末的Windows编程
这时大多数程序员使用VB、C或C++,一些C/C++程序员使用纯Win32API,但纯Win32API不是面向对象的,而且使用它的工作量很大,比MFC还大。大多数程序员在使用MFC(Microsoft Foundation Class,微软基础类库),MFC是面向对象的,但是它却不一致,并逐渐变得陈旧。其他的程序员开始转向了COM(Component Object Model,对象组件模型),COM相对前两者概念简单,但它的实际代码复杂,并且需要很多丑陋的、不雅的底层基础代码。
(二)下一代平台服务的目标
执行环境的目标:安全、多平台、性能;
开发环境的目标:面向对象、一致的编程环境、使用行业标准进行通信、简化的部署等;
二、.NET时代来临
2002年,微软发布了.NET框架的第一个版本,.NET框架是一种比MFC和COM编程技术更一致并面向对象的环境。
(一)NET框架的组成
.NET框架由三部分组成,如下图所示。

(1)编程工具:IDE、编译器、调试器、网站开发服务端技术(ASP.NET,WCF等);
(2)执行环境—CLR(公共语言运行库):内存管理、垃圾回收、即时编译等;
(3)BCL(基类库):在.NET框架中使用的一个大的类库,也可以在程序中使用;
(二) 大大改进的编程环境
面向对象的开发环境、自动垃圾收集、互操作性、不需要COM等;
注:关于互操作性的学习,可以参考这位大侠的文章:C#互操作系列
三、全新的编译过程
(一) 编译成CIL(公共中间语言)
.NET语言的编译器接受源代码文件,并生成名为程序集(程序集要么是可执行的,要么是DLL)的输出文件。下图阐述了这个过程。

(二) 编译成本机代码
程序的CIL直到它被调用执行时才会被编译成本机代码,在运行时,CLR执行如下图所示的步骤。

这里有两个名词需要理解:
(1)托管代码:使用.NET框架编写的代码成为托管代码(Managed Code),需要CLR。
(2)非托管代码:不在CLR控制下运行的代码,比如Win32 C/C++ DLL,称为非托管代码(Unmanaged Code)。
四、核心组件—CLR:一个不辞辛劳的清洁工
毫无疑问,.NET框架的核心组件是CLR(公共语言运行时),它在操作系统的顶层,负责管理程序的执行。

五、基础结构—CLI:一起长大的约定,那样清晰
过去,各种不同语言的类型特征(例如,组成整数的位数对于不同的语言和平台就有很大差别)不一致,缺乏统一性。为了使不同语言编写的程序和库能够一起有序协作,必须要有一组标准。
CLI就是这样的一组标准,它把所有.NET框架的组件连接成一个内聚的、一致的系统。它展示了系统的概念和架构,并详细说明了所有软件都必须坚持的规则和约定。CLI的组成如下图所示:

在CLI的众多组成部分中,最重要的是CTS和CLS。CTS(公共类型系统)定义了那些在托管代码中一定会使用的类型的特征,而CLS(公共语言规范)详细说明了一个.NET兼容语言的规则、属性和行为。
六、编译和执行的整个过程

上一篇 : c#学习路线及目录导航
下一篇 : 基础系列(2)—— 常用数据类型
参考资料:《C#图解教程》
基础系列(1)—— NET框架及C#语言的更多相关文章
- JVM基础系列第1讲:Java 语言的前世今生
Java 语言是一门存在了 20 多年的语言,其年纪比我自己还大.虽然存在了这么长时间,但 Java 至今都是最大的工业级语言,许多大型互联网公司均采用 Java 来实现其业务系统.大到国际电商巨头阿 ...
- JVM基础系列第15讲:JDK性能监控命令
查看虚拟机进程:jps 命令 jps 命令可以列出所有的 Java 进程.如果 jps 不加任何参数,可以列出 Java 程序的进程 ID 以及 Main 函数短名称,如下所示. $ jps 6540 ...
- JVM基础系列第14讲:JVM参数之GC日志配置
说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...
- JVM基础系列第13讲:JVM参数之追踪类信息
我们都知道 JVM 在启动的时候会去加载类信息,那么我们怎么得知他加载了哪些类,又卸载了哪些类呢?我们这一节就来介绍四个 JVM 参数,使用它们我们就可以清晰地知道 JVM 的类加载信息. 为了方便演 ...
- JVM基础系列第11讲:JVM参数之堆栈空间配置
JVM 中最重要的一部分就是堆空间了,基本上大多数的线上 JVM 问题都是因为堆空间造成的 OutOfMemoryError.因此掌握 JVM 关于堆空间的参数配置对于排查线上问题非常重要. tips ...
- JVM基础系列第10讲:垃圾回收的几种类型
我们经常会听到许多垃圾回收的术语,例如:Minor GC.Major GC.Young GC.Old GC.Full GC.Stop-The-World 等.但这些 GC 术语到底指的是什么,它们之间 ...
- JVM基础系列第9讲:JVM垃圾回收器
前面文章中,我们介绍了 Java 虚拟机的内存结构,Java 虚拟机的垃圾回收机制,那么这篇文章我们说说具体执行垃圾回收的垃圾回收器. 总的来说,Java 虚拟机的垃圾回收器可以分为四大类别:串行回收 ...
- JVM基础系列第8讲:JVM 垃圾回收机制
在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...
- JVM基础系列第7讲:JVM 类加载机制
当 Java 虚拟机将 Java 源码编译为字节码之后,虚拟机便可以将字节码读取进内存,从而进行解析.运行等整个过程,这个过程我们叫:Java 虚拟机的类加载机制.JVM 虚拟机执行 class 字节 ...
- JVM基础系列第6讲:Java 虚拟机内存结构
看到这里,我相信大家对于一个 Java 源文件是如何变成字节码文件,以及字节码文件的含义已经非常清楚了.那么接下来就是让 Java 虚拟机运行字节码文件,从而得出我们最终想要的结果了.在这个过程中,J ...
随机推荐
- iview中tree的事件运用
iview中的事件和方法如下: 案例说明: html代码 <Tree :data="data4" @on-check-change="choiceAll" ...
- 【原创】Dynamics CRM 2015/2016,以PDF的形式打开SSRS报表。
基本步骤: 使用SSRS建立报表,以下的例子是以记录的GUID作为报表的参数 获取ReportSession 和 ControlId来调用报表 以PDF的形式预览报表 一.根据报表的名称获取报表的GU ...
- STM32 Startup**.s文件中使用的 __main C函数入口
代码: ; Reset handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main L ...
- python+MongoDB使用示例
本博客起源于博主的大三NoSQL课程设计,采用python+MongoDB结合方式,将数据从txt文件导入MongoDB之中,再将其取出以作图.主要技术是采用python与MongoDB结合存储读取方 ...
- 138. Subarray Sum【Lintcode,by java】
Description Given an integer array, find a subarray where the sum of numbers is zero. Your code shou ...
- VC6无法生成Release版本程序
在工程设置,将Setting for后面的选项改为Win32 Release.然后重新编译.结果仍然没有生成release,而且打开设置时,依然是Win32 Debug. 解决办法,在VC6.0的工具 ...
- Hive中Join的类型和用法
关键字:Hive Join.Hive LEFT|RIGTH|FULL OUTER JOIN.Hive LEFT SEMI JOIN.Hive Cross Join Hive中除了支持和传统数据库中一样 ...
- 2016-2017-2 20155339《 java面向对象程序设计》实验四Android程序设计
2016-2017-2 20155339< java面向对象程序设计>实验四Android程序设计 实验内容 1.Android Stuidio的安装测试: 参考<Java和Andr ...
- 可以用来求急的开源项目es5-shim
最近发现一个JS库,无法在IE8中运行.比较纠结,又不想另找个库代替它,还好发现了这玩意. 它的作用:就给傻逼浏览器做兼容性,使得傻逼浏览器可以支持一些 es5 的 api ...
- 【LG4169】[Violet]天使玩偶/SJY摆棋子
[LG4169][Violet]天使玩偶/SJY摆棋子 题面 洛谷 题解 至于\(cdq\)分治的解法,以前写过 \(kdTree\)的解法好像还\(sb\)一些 就是记一下子树的横.纵坐标最值然后求 ...