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

《Inside C#》笔记(一) .NET平台的更多相关文章

  1. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...

  2. 笔记整理--Linux平台MYSQL的C语言

    Linux平台MYSQL的C语言API全列表 - 第三只眼的专栏 - 博客频道 - CSDN.NET - Google Chrome (2013/8/18 22:28:58)   Linux平台MYS ...

  3. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)补遗

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 昨晚上熬夜写了[Openwrt项目开发笔记]:O ...

  4. 【读书笔记】Android平台的漏洞挖掘和分析

    最近比较关注移动端的安全,以后也打算向安卓平台的安全发展.这篇博文主要是记录一些研究Android安全的读书笔记. Fuzzing技术的核心是样本生成技术 测试Android平台的组件间通信功能使用的 ...

  5. .Net 初步学习笔记之一——.Net 平台与.Net FrameWork框架的关系

    .Net 包含两部分 .Net平台 和.Net FrameWork 框架 1..Net FrameWork框架包含于.Net平台. .Net FrameWork提供环境和支撑保证.Net平台运行. 2 ...

  6. 深入Java虚拟机读书笔记第二章平台无关性

    Java的体系结构对平台无关的支持 Java平台 Java的体系结构通过几种途径支持Java程序的平台无关性,其中主要是通过Java平台自己.Java平台扮演一个运行时Java程序与其下的硬件和操作系 ...

  7. C# 学习笔记1 .NET平台,C#的重要概念

    .NET平台构成的三个关键实体是: 1.CLR(公共语言运行库):为我们定位,加载,管理.NET类型,同时负责一些底层细节的工作,如内存管理,应用托管,处理线程,安全检查等,它包含了一个重要名为msc ...

  8. [笔记] FMX 移动平台 TWebBrowser 问题

    FMX 移动平台下的 TWebBrowser 有一问题: 某些机子当 WebBrowser.Visible := False; 后,依然留在全屏,虽然看不见,但无法点击操作. 解决:用 WebBrow ...

  9. Docker笔记02-日志平台ELK搭建

    OS: Centos7 准备工作: 虚拟机中安装Centos, 搭建Docker环境 ELK简介: 略 文档地址 https://elk-docker.readthedocs.io/ 需要注意的是在B ...

随机推荐

  1. Spark中的常用算子

    更多有用的例子和算子讲解参见: http://homepage.cs.latrobe.edu.au/zhe/ZhenHeSparkRDDAPIExamples.html map是对每个元素操作, ma ...

  2. web的脚本安全-CSRF

    CSRF,即Cross-site request forgery,中文一般叫跨站请求伪造. 攻击原理是,用户在A网站(登录,之后打开一个B网站,B网站的脚本(或HTML标签)向A网站发送一个请求,这个 ...

  3. Android返回系统Home桌面

    Intent intent = new Intent(); // 为Intent设置Action.Category属性 intent.setAction(Intent.ACTION_MAIN);// ...

  4. JAVA+SELENIUM+MAVEN+TESTNG框架(二)新建项目

    1.新建maven项目 2.下载selenium的jar包,放入maven依赖库中 3.新增testng依赖库,build path->add libirary->testng 4.查看自 ...

  5. Vue笔记:VS Code 常用快捷键

    VS Code 常用快捷键 1.注释: 单行注释:ctrl+/, 注释后再按取消 取消单行注释:alt+shift+A 注释后再按取消 2.移动行 向上移动一行:alt+up 向下移动一行:alt+d ...

  6. 基于HA机制的MyCat架构——配置HAProxy

    HAProxy简介HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy特别适用于那些负载特大的web站点,这些站 ...

  7. dubbo + zookeeper 简介和部署

    Dubbo简介: Dubbo 是阿里巴巴公司开源(以前不开源)的一个高性能优秀的服务框架, 使得应用可通过高性能的 RPC 实现服务的输入和输出功能, 可以和spring框架无缝集成. 那么这里, 啥 ...

  8. 散列算法-MD5

    信息摘要技术把明文内容按某种规则生成一段哈西值,即使明文消息只改动了一点点,生成的结果也会完全不同. MD5(Message-digest algorithm 5)就是信息摘要的一种实现,它可以从任意 ...

  9. SQL分区表示例

    -- Create tablecreate table TT_FVP_OCR_ADDRESS( id NUMBER not null, waybill_no VARCHAR2(32) not null ...

  10. df说磁盘空间满了, du说没有,到底谁是对的

           同事求助, 他在删掉一个很大的文件后, 磁盘空间依旧没释放.上去一看, 果然 df 看到磁盘空间占用依旧是100%,等等 du 看了一把,磁盘空间剩余很大. 造成这个原因是因为进程依旧打 ...