C# 基于.NET运行时,所以有必要首先对.NET以及C#与.NET平台的关系有一定的了解。

一 .NET平台

.NET背后的基本思想是将原本独立工作的设备、网络服务整合在一个统一的平台上,从而可以为用户提供丰富全面的解决方案。平时提到.Net一般默认指的是.Net Framework,但其实这只是.NET平台的一部分另外还包括.NET Building Block Service、.NET Device Software等一系列看不懂的东西。.Net Framework包含公共语言运行时Common Language Runtime(CLR)和.Net Framework类库两部分。可以把公共语言运行时理解成.NET平台的虚拟机,另外所有的.NET语言都包含了.Net Framework类库。这个类库涵盖了从文件读写到数据库操作再到XML、SOAP等等非常广泛的功能。


二 .NET Framework

a) CLR

CLR是.NET的核心,它是一个支持多种语言的程序同时运行、互相配合的实时环境。CLR支持多语言(C#, VB.NET,F#等)之间的互操作,那么它是怎么做到这一点的呢——因为这些语言都遵循了公共语言规范Common Language Specification(CLS)。一门语言只有遵守了CLS规范,才能创建运行在CLR上的应用程序。

关于CLR还有另一个重要的概念:托管代码。托管代码是在CLR的保护和管理下运行的代码,由CLR负责托管代码的内存分配、任务调度以及托管代码之间的通讯,这可以保证每个应用程序(即使是使用不同的语言编写的)都能够遵循统一的行为规范。

b) .Net Framework类库

.Net Framework类库对保证多语言间的互操作性具有重要意义。因为通过.Net Framework类库开发者能使用由CLR提供的统一接口。虽然其它许多语言都有自己的类库,比如C++,但.Net平台特殊的地方在于,编程语言之间的区别仅仅在于调用.Net Framework类库时,在语义上的区别。下面来对比C++和C#对“Hello, World”程序的实现:

C++:

C#版:

C++可以使用cout函数直接输出“Hello, World”,但C#要使用类库提供的WriteLine方法。C++本身包含一个负责字符处理、文件读写、屏幕显示等的类库,这可以认为是C++语言本身的功能,但C#等.NET平台下的语言却不具备这些功能,这些功能属于类库,离开类库,C#之类的语言基本上做不了任何事情。

c) IL码和JITters

.NET平台的语言编译器会将源码编译成IL码Microsoft Intermediate Language(MSIL), IL码本身也可以说是一种编程语言。在编译好的应用程序第一次被执行时,IL码才被编译成真正的机器码。大概过程如下

1. 用C#编写源码

2. 使用C#编译器(csc.exe)编译成IL码

3. 在编译好的应用程序被执行时,会使用实时编译器Just-In-Time Compiler(JITter)将IL码转换为机器码。

JITter只在某个方法被调用时才编译该方法,而且编译好的机器码会被缓存起来,只有C#源码发生变化时才重新编译机器码。


三 .NET类库的主要结构

学习资料:Inside C# by Tom Archer

最新文章

  1. ThinkPHP 多语言
  2. Java 中使用javah编译头文件出现找不到类的情况
  3. 08 高效的SQL
  4. ext_EditorGridPanel (8)
  5. 【原】centos6.5下cdh4.6 Oozie安装
  6. jQuery慢慢啃之核心(一)
  7. coreos docker 尝新奇
  8. POJ 2488 A Knight's Journey(深搜+回溯)
  9. docker tag
  10. SQL SERVER大话存储结构(3)_数据行的行结构
  11. 习题 7-2 uva225(回溯)
  12. Mysql--执行计划 Explain
  13. BZOJ_1100_[POI2007]对称轴osi_KMP+计算几何
  14. 软件测试实验二----selenium、katalon、junit
  15. 小程序获取openid 出现null,{"errcode":40163,"errmsg":"code been used, hints: [ req_id: WNUzlA0105th41 ]"}
  16. SpringBoot使用数据库
  17. HttpClient超时设置setConnectionTimeout和setSoTimeout
  18. Standard C 之 math.h和float.h
  19. CentOS安装oracleJDK
  20. [整理]内存重叠之memcpy、memmove

热门文章

  1. Struts框架核心工作流程与原理
  2. springboot-27-整合mybatis,druid连接池
  3. IC 设计中DFT的Boundary Scan功能
  4. 白话$resource,$resource中的增删改查
  5. APIO 2018 游记
  6. 第19课-数据库开发及ado.net ADO.NET--SQLDataReader使用.SqlProFiler演示.ADoNET连接池,参数化查询.SQLHelper .通过App.Config文件获得连接字符串
  7. Debug模式下,测试app后缀名“-测试”
  8. 【Java并发编程】10、Java 理论与实践: 正确使用 Volatile 变量
  9. 【Java基础】7、Java同步机制之Monitor监视器与syncrhoized实现原理
  10. Ubuntu 18.04 安装 Docker-ce(就是Docker社区版本)