《Visual C# 2010入门经典》一1.1 .NET Framework

简介: 有关多线程和并行编程的更详细信息,请参阅第23章。 对于托管代码,并行计算平台提供了常见循环指令的并行实现和LINQ to Objects的并行实现,还新增了可避免死锁的线程安全集合。Visual Studio 2010新增了一些诊断工具,如并行分析器和处理器迁移分析,让您能够轻松地调试和优化代码

本节书摘来异步社区《Visual C# 2010入门经典》一书中的第1章,第1.1节,作者: 【美】Scott Dorman
译者: 张劼 责编: 傅道坤,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.1 .NET Framework

Visual C# 2010入门经典
.NET Framework提供了一些工具和技术,让开发人员能够以独立于语言和平台的方式创建并运行下一代应用程序和Web服务。它提供了一个庞大的类库,这个类库支持众多常见的任务,简化了众多艰难的任务,让您能够将更多的时间用于解决手头的任务:以尽可能高效的方式满足业务需求。

.NET Framework具有如下功能。

  • 提供了一个运行环境,以简化软件开发过程,降低版本冲突的可能性。
  • 确保代码的安全执行。
  • 基于行业标准进行所有通信,从而能够与非.NET代码集成。
  • 让应用程序的开发过程独立于语言和平台,确保各种应用程序的开发体验都是一致的。
  • 提供了一个运行环境,尽可能消除了脚本语言或解释型语言的性能问题。

为实现上述目标,.NET Framework包含4个组件。

第一个组件是公共语言运行时(Common Language Runtime),可将其视为.NET Framework的核心。就像心脏让机体能够正常运行一样,公共语言运行时提供了低级核心服务供应用程序使用,并负责管理应用程序的代码。针对.NET Framework编写的代码称为托管代码(managed code),而其他代码称为非托管代码(unmanaged code)。

.NET Framework的第二个组件是类库,它包含大量可重用的类(类型),可用于开发您能够想象得到的任何应用程序。

1.1 .NET Framework


q1

注意:Framework类库

Framework类库包含4000多个公有类,是当今最大的类库之一。
.NET Framework通过类库在公共语言运行时中支持并行编程,并在并行计算平台中提供了诊断工具。并行计算平台是.NET Framework的第三个组件,让您能够以自然而简单的方式编写高效的可扩展代码,以充分利用多个处理器。

.NET Framework的第四个组件是动态语言运行时,它建立在公共语言运行时的基础之上,向诸如IronRuby和IronPython等动态语言提供语言服务。与诸如C#等通用语言相比,动态语言更擅长执行某些任务,而动态语言运行时让您能够根据业务需求选择最合适的语言。不仅如此,动态语言运行时还让非动态语言(如C#)能够以简单而一致的语法使用动态对象,而不管这些对象源自COM、IronRuby、IronPython还是JavaScript。


q2

提示:动态语言是什么?

在诸如C#等使用静态类型的语言中,由编译器确定类型安全,如果无法确定,就将生成错误。在动态语言中,不会尝试确定类型安全。另外,大多数动态语言在运行阶段执行更复杂的类型操作,如判断方法重载是否正确,而C#在编译阶段做出这种判断。

实际上,对于静态类型语言在编译阶段执行的所有任务,动态语言都将在运行阶段执行。这包括在运行阶段使用eval或repl循环生成代码,以修改运行对象的状态。因此,动态语言提供了极大的灵活性,常用作脚本语言。

一些常见的动态语言包括Jscript、JavaScript、Python、IronPython、Ruby和IronRuby。
针对.NET Framework编写的代码称为托管代码,而根据这些代码生成的应用程序称为托管应用程序。托管应用程序运行时,将自动承载(host)相应的公共语言运行时。.NET Framework不仅提供了大量的运行时宿主,还提供了让您能够编写宿主的工具。这样,诸如Internet信息服务(IIS)和Microsoft SQL Server等非托管应用程序也可承载公共语言运行时备份,从而能够利用托管功能和非托管功能。

图1.1说明了.NET Framework的各个组件与应用程序、操作系统和非托管应用程序之间的关系。


q3

1.1.1 公共语言运行时
公共语言运行时(Common Language Runtime,CLR)是.NET Framework的核心,提供了一个统一类型系统和一个托管运行环境,它们为开发和执行独立于语言和平台的应用程序打下了坚实的基础,还有助于消除(至少是减少)众多常见的编程错误。

1.通用类型系统
前面介绍的统一类型系统称为通用类型系统(Common Type System,CTS),让所有.NET语言共享相同的类型定义,这样便可以一致的方式操作这些类型。这有助于确保正确地编写应用程序,其原因如下。

消除了将不兼容的数据赋给类型的可能性。
每种.NET语言的类型描述都相同,而不管用于定义该类型的语言是什么。
以一致的方式操作类型。

q4

提示

本章后面将简要地介绍类型,而第2章将更详细地讨论它们。

q5

注意:类型安全和CTS

通用类型系统和公共语言规范为.NET Framework类型安全打下了坚实的基础。

这让.NET Framework能够以一致的方式倡导类型安全,而无需强制执行类型安全。强制执行类型安全的任务留给了语言编译器和稍后将介绍的虚拟执行系统。
通用语言系统以独立于语言的方式定义类型,因此它必须考虑这些语言之间的差别。通用语言系统提供了一个最基本的规则集,所有.NET语言及其编译器都必须遵守,这个规则集称为公共语言规范(Common Language Specification,CLS)。这种通用定义让语言集成成为可能:使用另一种语言中定义的类型,就像它是在当前语言中定义的一样。


q6

提示:CLS遵从性

几乎Framework类库中的所有类都符合CLS,因此任何.NET语言都可使用这个类库。如果要开发自己的类库,那么建议您确保这些类也符合CLS,这样它们才能得到最广泛的使用。
2.通用中间语言
通用类型系统和公共语言规范有助于实现独立于语言和平台的目标,但是如果编译器生成的可执行目标代码依赖于硬件平台,那么它们带来的好处将消失殆尽。为解决这个问题,将托管代码进行了部分编译,以生成使用一种低级语言的代码,这种语言称为通用中间语言(Common Intermediate Language,CIL)。通用中间语言类似于汇编语言,由表示高级语言代码的低级指令组成。

程序集(assembly)是部分编译单元(包),包含CIL指令并为定义类型提供了逻辑边界。由于程序集是部分编译的,因此可以是32位的,也可以是64位的,这取决于操作系统和硬件。这意味着托管应用程序是独立于平台的,且无需重新编译或添加特殊指令就可以充分利用硬件技术。

3.虚拟执行系统
公共语言运行时的另一个重要组成部分是托管运行环境,这种环境称为虚拟执行系统(Virtual Execution System,VES),它负责处理应用程序所需的低级核心服务。就像Java应用程序需要有Java虚拟机(JVM)才能运行一样,托管应用程序也需要有CLR(具体地说是VES)才能运行。

.NET应用程序启动时,由VES负责加载并执行CIL代码,并管理应用程序所需的内存分配。换句话说,VES提供服务和基础设施,从而消除平台和语言差异带来的影响。

在加载和编译过程中,VES执行各种验证,以确保文件格式、程序集元数据和CIL是一致的,并确保CIL指令不能非法访问内存。这样,应用程序将只能访问它被授权访问的内存和资源。可将这种受限的环境视为沙箱(sandbox)。

既然VES提供了运行环境并执行包含CIL的程序集,那么这些程序集是解释型还是编译型的呢?别忘了,.NET Framework的目标之一是提供这样的运行环境:最大程度地减少甚至消除脚本(解释型语言)的性能问题。这意味着CIL代码是编译型的,但编译是在什么时候完成的呢?

VES提供的服务之一是即时(Just-In-Time,JIT)编译器。即时编译指的是在运行阶段将经过部分编译的CIL代码转换为可执行的目标代码(本机代码)。


q7

提示:即时编译

即时编译过程被称为jitting,而JIT编译器被称为jitter。
通过以这种方式编译代码,.NET Framework获得了比传统解释型语言高得多的速度。相对于常规(静态)编译,即时编译也有优势,因为它可在运行阶段实施安全保障,还可在运行阶段重新编译以进一步优化代码。.NET Framework JIT编译器进行了高度优化,以便将CIL代码编译成高效的目标代码;它在需要时运行,并缓存编译后的代码供以后使用。

4.内存管理和垃圾收集
在众多非托管编程语言中,内存管理是个经典问题,它可能导致一些常见的错误。使用这些编程语言时,开发人员负责在正确的时间分配和回收内存。.NET Framework让VES自动分配和回收内存,从而解决了这个问题。

这种自动内存管理称为垃圾收集,正是它让C#(和其他.NET语言)成为一种垃圾收集语言。垃圾收集让您无需过多地为释放不需要的内存而操心,它避免了众多常见的编程错误,让您创建的应用程序更稳定,并可重点关注应用程序所需的业务逻辑。

即使有了自动内存管理,理解垃圾收集器如何与程序以及您创建的类型交互也很重要。深入讨论垃圾收集超出了本书的范围,但第22章将简要地讨论它。

1.1.2 Framework类库

虽然CLR是.NET Framework的核心,但真正赋予它力量的是Framework类库(FCL)。这个类库类似于Java类库、C++标准模板库(STL)、Microsoft活动模板库(ATL)、Microsoft Foundation Class(MFC)、Borland对象窗口库(OWL)及其他类库。

与这些类库一样,FCL也包含大量可重用的类型,这简化了众多常见的编程任务,从而提供了开发效率。

图1.2列出了FCL中的一些类型,并按功能对它们进行了编组。


q8

注意:Framework类库

Framework类库充分说明了.NET Framework让简单的事情容易、让艰难的事情可能的特征。

虽然不使用FCL提供的类型也可以创建应用程序,但实际上不可能这样做。
在最底层是基础类库(Base Class Libraries,BCL),它们充当所有.NET语言的标准运行环境,提供的类型可表示CLR类型、集合、流和其他数据结构,可用于操作字符串、执行基本的文件存取和各种其他操作。BCL总共有172种公有类型,而Ecma-335标准(Common Language Infrastructure (CLI), 4th Edition)定义的标准库总共有331种公有类型。


q9

提示:Ecma是什么?

Ecma International是一个创建于1961年的国际标准协会,旨在帮助制定信息通信技术和消费电子产品的使用标准。

2001年12月14日,C#语言规范(C# Language Specification)和通用语言基础设施(Common Language Infrastructure,CLI)获批成了Ecma标准。

CLI是公共语言运行时(Common Language Runtime)的开源版本。在Ecma的鼓励下,开发了C#和.NET Framework的多个开源版本,包括DotGNU和Mono。其中最著名的可能是Mono,它提供的.NET开发平台实现可用于Linux、BSD、UNIX、Mac OS X、Solaris和Windows操作系统。

正是Ecma提供的开源标准以及诸如DotGNU和Mono等项目让开发技能和应用程序几乎可用于任何平台。
FCL中的其他类关注的都是特定功能,如提供数据访问、XML支持、全球化支持、诊断、配置、联网、通信、业务流程支持、Web应用程序和Windows桌面应用程序等。

命名空间
鉴于.NET Framework类库包含数千个类,需要采取某种方式避免类名混淆,并提供一种方便的层次编组机制。为此,.NET Framework采用了命名空间的概念。命名空间不过是一系列类型,对类型的可见性没有任何影响。命名空间可包含多个程序集。.NET Framework使用层次型命名空间提供了一个渐进型框架,打造出了一个功能强大而又易于使用的开发平台。


q10

注意:命名空间和类型名

命名空间使用点分式语法表示层次结构,每层之间都用句点(.)分隔。

在类型的完整名称中,以最右边的句点为分界点,左边是命名空间,而右边是类型名。例如,System.Printing.PrintDriver是位于命名空间System.Printing中的类型PrintDriver的完整名称。

然而,只有.NET编程语言支持命名空间。在CLR中,类型总是用完整名称标识,其中包含类型的名称及其所属的命名空间。
.NET Framework类库包含大约4000个命名空间,但有些命名空间您一辈子也不会与它打交道。随着您越来越熟悉这个类库,您将发现有些命名空间是您较常用的,而它们可能与您的同事常用的命名空间不同。

表1.1列出了最常用的命名空间。


q11

1.1.3 并行计算平台
一直以来,都可使用托管和非托管代码编写多线程和异步应用程序,但要正确地编写这样的应用程序始终很困难。.NET Framework 4.0提供的并行计算平台简化了这种应用程序的编写工作。这是一种全新的编程模型,适用于托管代码和非托管代码。它提高了抽象程度,让您无需考虑较低级的概念,如线程和锁定。


q12

提示

有关多线程和并行编程的更详细信息,请参阅第23章。
对于托管代码,并行计算平台提供了常见循环指令的并行实现和LINQ to Objects的并行实现,还新增了可避免死锁的线程安全集合。Visual Studio 2010新增了一些诊断工具,如并行分析器和处理器迁移分析,让您能够轻松地调试和优化代码。

并行计算平台简化了这样的机制:编写可高效利用多个处理器的代码。要确定什么样的代码适用于并行计算,仍需要进行分析,当您考虑如何解决特定问题时,这将改变您的思考方式。第23章将简要地介绍并行计算平台的上述方面。

1.1.4 动态语言运行时
动态语言运行时(Dynamic Language Runtime,DLR)是.NET Framework 4.0新增的,这是一个为动态语言提供服务和支持的运行环境。

DLR建立在公共语言运行时的基础之上,这意味着动态语言可与其他.NET语言集成。DLR还让现有的静态语言(如C#)能够支持动态功能,这让它们能够以一致的方式使用动态对象,而不管这些对象来自何方。


q12

提示:

第21章将详细介绍如何集成动态语言。
有了DLR后,便可支持动态语言,而静态语言也可使用动态功能。这样,开发人员就可根据要解决的问题选择最合适的语言,且创建的动态代码可供其他开发人员和.NET语言轻松地使用。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
10天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
61 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
1月前
|
开发框架 算法 搜索推荐
C# .NET面试系列九:常见的算法
#### 1. 求质数 ```c# // 判断一个数是否为质数的方法 public static bool IsPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) { return false; } } return true; } class Progr
58 1
|
1月前
|
并行计算 安全 Java
C# .NET面试系列四:多线程
<h2>多线程 #### 1. 根据线程安全的相关知识,分析以下代码,当调用 test 方法时 i > 10 时是否会引起死锁? 并简要说明理由。 ```c# public void test(int i) { lock(this) { if (i > 10) { i--; test(i); } } } ``` 在给定的代码中,不会发生死锁。死锁通常是由于两个或多个线程互相等待对方释放锁而无法继续执行的情况。在这个代码中,只有一个线程持有锁,且没有其他线程参与,因此不
102 3
|
3月前
|
Linux C# 开发工具
C#开源的一款友好的.NET SDK管理器
C#开源的一款友好的.NET SDK管理器
|
4天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
C#/.NET/.NET Core拾遗补漏合集(持续更新)
|
1月前
|
Windows
windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案
windows server 2019 安装NET Framework 3.5失败,提示:“安装一个或多个角色、角色服务或功能失败” 解决方案
|
1月前
|
SQL 存储 关系型数据库
C# .NET面试系列十:数据库概念知识
#### 1. 为什么要一定要设置主键? 设置主键是数据库设计中的一个重要概念,有几个主要原因: 1、唯一性 ```c# 主键必须保证表中的每一行都有唯一的标识。这样可以避免数据冗余和不一致性。如果没有主键或者主键不唯一,就可能出现数据混乱或错误。 ``` 2、查询性能 ```c# 数据库系统通常会使用主键来加速数据检索。主键通常会被索引,这样可以更快速地找到特定行的数据,提高查询效率。 ``` 3、关联性 ```c# 主键常常用于建立表与表之间的关系。在关系数据库中,一个表的主键通常与其他表中的外键建立关联,这种关系对于数据的一致性和完整性非常重要。 ``` 4、数据完
131 1
C# .NET面试系列十:数据库概念知识
|
1月前
|
XML 开发框架 .NET
C# .NET面试系列八:ADO.NET、XML、HTTP、AJAX、WebService
## 第二部分:ADO.NET、XML、HTTP、AJAX、WebService #### 1. .NET 和 C# 有什么区别? .NET(通用语言运行时): ```c# 定义:.NET 是一个软件开发框架,提供了一个通用的运行时环境,用于在不同的编程语言中执行代码。 作用:它为多语言支持提供了一个统一的平台,允许不同的语言共享类库和其他资源。.NET 包括 Common Language Runtime (CLR)、基础类库(BCL)和其他工具。 ``` C#(C Sharp): ```c# 定义: C# 是一种由微软设计的面向对象的编程语言,专门为.NET 平台开发而创建。 作
174 2