关于C#与.NET Framework

时间:2023-03-10 01:42:37
关于C#与.NET Framework

前几天,有一个做测试的问我.NET Framework是什么,和C#是什么关系呢。

下面我就来解释一下.NET Framework是什么:.NET Framework是一个框架,是应用程序运行时所需要的执行环境,它为应用程序的执行提供有几种服务:

(1)全面的类库:提供了丰富的类库供程序员使用,使程序员的开发更具效率。

(2)内存管理:在其他编程语言中,有许多是需要程序员来负责内存的分配和释放以及管理对象生命周期。在.NET Framework的框架下, 程序员可以不必担心内存的问题(当然,这不是绝对的),因为它提供了优质的内存管理服务。

(3)通用类型系统(Common Type System,CTS):其定义了可以在中间语言(IL,接下来会解释)中使用的预定义数据类型。

(4)开发结构和技术:.NET Framework提供了开发特定程序所需要的库,比如WPF,WCF,ASP.NET等。

(5)语言的互操作性:在.NET Framework上的语言编译器都提供了生成中间语言(IL,至于什么是IL,下一篇解释)的机制,这种机制使得不同的语言可以互相操作。

以上的这些只是一个简单的概念,下面就来看一下.NET Framework由什么组成:

.NET Framework主要有两个部分组成:一是公共语言运行时(Common Language Runtime,CLR);二是.NET Framework类库(Framework Class Library,FCL)。

1、公共语言运行时(CLR)

它是.NET Framework的核心基础。我觉得可以把它看成是一个容器,在这个容器里面,它提供了内存管理,线程管理,异常处理,检查类型安全等服务。放在里面执行的代码叫做托管代码(managed code),没有放在里面执行的代码成为非托管代码(unmanaged code)。一般C#所写出来的代码都是托管代码。

CLR包含两个组成部分:通用类型系统(Common Type System,CTS,上文有提及)和公共语言规范(Common Language Specification,CLS)。

  • CTS:C#和VB.NET是两种还有比较使用的语言,它们都是由CLR进行管理的,但是它们在语法和数据类型方面都是不一样的,CLR是怎样进行托管呢?CTS就是用来解决这个问题的,它解决了不同语言之间数据类型不同的问题,for example:C#中定义整型用int,而VB用的是Integer,很明显的不一样,通过CTS可以把这两个类型变成通用的Int32。所有的.NET Framework都共享这一类型系统,从而使它们可以实现无缝互操作。
  • CLS:刚才说到了CTS解决了数据类型的不一样,那CLS就是用来解决语法规范上的区别。CLS是一种最低的语言标准,它指定了以.NET平台为目标的语言所必须支持的最小特征,以及某一语言与其他.NET语言之间实现互操作所需要的完备特征。认识到这点很重要,这里讨论的特征问题已不仅仅是语言间的简单语法区别。例如,CLS并不去关心一种语言用什么关键字实现继承,只是关心该语言如何支持继承。CLS是CTS的一个子集。这就意味着一种语言特征可能符合CTS标准,但又超出CLS的范畴。例如:C#支持无符号数字类型,该特征能通过CTS的测试,但CLS却仅仅识别符号数字类型。因此,如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言(如VB.NET)设计的.NET组件实现互操作。

2、.NET Framework类库(FCL)

它是一组DLL程序集的集合,包含了大量定义好的类型以及功能。程序员可以利用这些功能,快速的进行出多种应用程序,比如WPF,Windows Form和ASP.NET应用程序。

下图很好的解释了.NET Framework的情况:红色框框内的东西就是.NET Framework的组成部分。

关于C#与.NET Framework

那接下来就来说说第二个问题,C#与.NET Framework的关系是什么呢?

其实上面的那个图片应该也解释得清楚了,C#是面向.NET Framework开发的语言。除了C#之外,VB.NET和F#也都是一样的。

打个比较经典的比喻吧:.NET Framework相当于是一艘航空母舰,在这艘舰艇上面可以搭载很多种型号的飞机,比如歼11(C#),海直八(VB.NET),空警200(F#)等。都可以在.NET Framework这艘航空母舰上运行。

下面介绍C#版本与.NET Framework之间的版本关系

C#版本

.NET Framework版本

Visual Studio版本

发布日期

特性

C# 1.0

.NET Framework 1.0

Visual Studio .NET 2002

2002.1

委托事件

C# 1.1

.NET Framework 1.1

Visual Studio .NET 2003

2003.4

APM(异步编程模型)

C# 2.0

.NET Framework 2.0

Visual Studio 2005

2005.11

泛型

匿名方法

迭代器可空类型

C# 3.0

.NET Framework 3.0

.NET Framework 3.5

Visual Studio 2008

2007.11

隐式类型的局部变量

对象集合初始化

自动实现属性

匿名类型

扩展方法

查询表达式

Lambda表达式

表达式树

分部类和分部方法

LINQ

C# 4.0

.NET Framework 4.0

Visual Studio 2010

2010.4

动态绑定

命名和可选参数

泛型的协变和逆变

互操作性

C# 5.0

.NET Framework 4.5

Visual Studio 2012

2012.8

异步和等待调用方信息