第一章C#和.net框架

  1. c#只是.net的一部分,.net不只包含C#。C#是一种程序语言,.net是一个框架/平台

C#和.NET框架

在.NET之前

20世纪90年代,微软平台多数程序员使用VB、C或C++。他们使用的技术都有问题。

技术

问题

纯Win32 API

不是面向对象,工作量比MFC大

MFC(Microsoft Foundation Class,微软基础类库)

虽是面向对象,但是不一致,且过于陈旧

COM(Component Object Model,组件对象模型)

虽然概念简单,但实际代码复杂丑陋

通病

以上技术都针对桌面程序开发,与Web编程大相径庭

由此引出下一代平台的目标

.net高性能框架 .net 框架_CLR

.NET时代

.Net框架特点

  • 多平台
  • 采用行业标准的通信协议
  • 提供更安全的执行环境
.NET框架的组成

.net高性能框架 .net 框架_CIL_02

CLR(Common Language Runtime,公共语言运行库)

  • 内存管理和垃圾回收
  • 代码安全验证
  • 代码执行、线程管理及异常处理

编程工具涵盖编码和调试所需一切

  • Visual Studio IDE
  • .Net兼容编译器
  • 调试器
  • 网站开发服务器端技术,比如ASP.NET或WCF

BCL(Base Class Library,基类库):.NET框架使用的一个大类库

大大改进的编程环境
  1. 面向对象
  2. 自动垃圾回收 
    CLR有GC(Garbage Collector,垃圾收集器),为你自动管理内存。(自动从内存中删除程序不再访问的对象)
  3. 互操作性
  • .NET语言允许不同.NET语言编写的软件模块无缝交互
  • 一种.NET语言写的程序可以使用甚至继承用另一种.NET语言写得类,只需遵循一定规则
  • 因为能容易的集成不同编程语言生成的模块,.NET框架有时被称为语言无关
  • .NET提供平台调用(platform invoke,P/Invoke):允许.NET代码调用并使用非.NET代码。它可以使用标准Win32 DLL导出的纯C函数代码,比如Windows API
  • .NET框架允许与COM互操作:.NET框架组件能调用COM组件,COM组件也能调用.NET组件。
  1. 不需要COM 
    摆脱了COM也就能摆脱下面这些东西,但系统中依然使用很多COM组件,所以偶尔还需要编写代码与这些组件交互,这将在25章讨论
  • IUnknown接口
  • 类型库
  • 手动引用计数
  • HRESULT
  • 注册表
  1. 简化的部署
  • .NET程序无需注册表,意味着最简单情形下,复制过去就能用。
  • .NET提供并行执行的特性,允许一个DLL的不同版本在同一机器上存在。即每个程序都可访问程序生成时使用的版本DLL
  1. 类型安全性 
    CLR检查并确保参数及其它数据对象的类型安全,不同编程语言编写的组件间也无问题
  2. 基类库 
    .NET框架提供一个庞大的基础类库(Base Class Library,BCL)。在写程序时可以使用其中的类
  • 通用基础类 : 一组强大的工具,比如文件操作、字符串操作、安全和加密。
  • 集合类 : 列表、字典、散列表及位数组
  • 线程和同步类 : 用于创建多线程程序
  • XML类 : 用于创建、读取及操作XML文档

编译成CIL

  • 程序集要么可执行,要么是DLL
  • 程序集的代码不是本机代码,而是一种名为CIL(Common Intermediate Laguage,公共中间语言)的中间语言
  • 程序集包含以下内容
  • 程序的CIL
  • 程序中使用的类型的元数据
  • 对其它程序集引用的元数据

CIL又叫IL(Intermediate Language)或MSIL(Microsoft Intermediate Language)

.net高性能框架 .net 框架_Common_03

编译成本机代码并执行

程序的CIL直到被调用才会被编译成本机代码。运行时,CLR执行下面的步骤

  • 检查程序集安全特性
  • 在内存中分配空间
  • 把程序集中可执行代码发送给实时(Just-in-Time,JIT)编译器,把其中一部分编译成本机代码

.net高性能框架 .net 框架_.net高性能框架_04

一旦CIL被编译成本机代码,CLR就在它运行时管理它,执行释放无主内存、检查数组边界、检查参数类型、管理异常等任务。同时两个术语由此而生

  • 托管代码:为.NET框架编写的代码,需要CLR
  • 非托管代码:不在CLR控制下运行的代码,比如Win32 C/C++ DLL 
    编译和执行

.net高性能框架 .net 框架_Common_05

CLR Common Language Runtime

CLR 在操作系统的顶层,负责管理程序执行 
还提供下列服务

  • 自动垃圾收集
  • 安全和认证
  • 通过访问BCL(Base Class Livrary,基类库)得到广泛的编程功能,包括如Web服务和数据服务之类的功能

.net高性能框架 .net 框架_CLR_06

CLI Common Language Infrastructure

过去由于语言和平台的不同,编程语言的内置类型各不相同。 
例如,组成整数的位数对应不同语言和平台就有很大差别。 
为了统一协作,必须有一组标准,这就是CLI(Common Language Infrastructure,公共语言基础结构)

.net高性能框架 .net 框架_CLR_07


 

CLI的重要组成部分

  1. 公共类型系统 
    CTS(Common Type System,公共类型系统)定义了在托管代码中一定会使用的类型特征。
    • 定义了一组丰富的内置类型,以及每种类型固有的、独有的特性
    • .NET兼容编程语言的类型通常映射到CTS中已定义内置类型集的某一特殊子集
    • CTS的所有类型都继承自公共基类-object
    • 使用CTS可确保系统类型和用户定义类型能被任何.NET语言兼容使用
  2. 公共语言规范 
    CLS(Common Language Specification,公共语言规范)详细说明了一个.NET兼容编程语言的规则、属性、行为,其主题包括数据类型、类结构、参数传递。

各种缩写

.net高性能框架 .net 框架_Common_08

C#的演化

版本

焦点特性

章节

5.0

异步

20

4.0

命名参数和可选参数

5

3.0

LINQ

19

2.0

泛型

17

1.0

C#