C#是一种全新的编程语言,它是为了与Windows的.NET Framework一起使用而被设计出来的,是一种基于现代面向对象设计方法的语言,吸取了其他类似语言的经验。它本身只是一种语言,并不是.NET的一部分。.NET支持的一部分特性,C#并不支持,而 C#支持的一些特性,.NET也不支持。
.NET的体系结构
- 公共语言运行库(CLR)
这是.NET Framework的核心运行库和执行环境,在CLR的控制下运行的代码称为托管代码(managed code)。在CLR执行编写好的代码之前,需要编译它们,编译分为两个阶段
- 把源代码编译为Microsoft的中间语言(IL)。
- CLR把IL编译为平台专用的代码。
托管代码的优点: 中间语言是低级语言,语法很简单(使用数字代码,而不是文本代码),可以非常快速的转换为内部机器码。对于代码来说这种精心设计的通用语法有很重要的优点。
与平台无关:包含字节代码指令的同一文件可以放在任意平台中,运行时编译过程的最后阶段可以很容易完成。这样代码可以运行在特定平台上。
提高了性能:中间语言总是即时编译的(JIT编译),JIT编译器并不把整个应用程序一次便宜完(这样会有很长的启动时间),而是只编译它调用的那部分代码。代码编译过一次后,得到的内部可执行代码就存储起来,直到退出该应用程序为止,这样下次运行这部分代码时,就不需要重新编译了。
语言具备了互操作性:中间语言能将任何一种.NET支持的语言编译为中间代码。编译好的代码可以与从其他语言编译过来的代码进行交互操作。
- 中间语言(MSIL)
主要特征:面向对象和使用接口;值类型和引用类型存在巨大差别;强制数据类型;使用异常来处理错误;使用特性。
面向对象和接口支持:Microsoft为IL选择的特定道路是传统的面向对象编程,带有类的单一继承性。中间语言还引入了接口的概念,提供一个契约,实现给定接口的类必须提供该接口指定的方法和属性的实现方式。
值类型和引用类型的巨大差异:对于值类型,变量直接保存其数据;对于引用类型,变量仅保存地址,对应的数据可以在该地址中找到。引用类型的实例总是存储在一个名为“托管堆”的内存区域;值类型一般存储在堆栈中。
强制数据类型:所有变量都清晰的标记为属于某个特定的数据类型,特别是中间语言不允许对模糊的数据类型进行任何操作。
语言的互操作性:.NET解决这个问题使用了通用类型系统(CTS)和公共语言规范(CLS)。CTS定义了可以在中间语言中使用的预定义数据类型,所有面向.NET Framework的语言都可以生成最终基于这些类型的编译代码。通用类型系统不仅指定了基本数据类型,还定义了一个内容丰富的类型层次结构,代码允许定义它自己的类型,通用类型系统的层次结构反映了中间语言的单一继承的面向对象方法。CLS是一个最低标准,有两种工作方式:首先各个编译器的功能不必强大到支持.NET的所有功能;第二如果限制类只能使用CLS兼容的特性,就要保证用其他语言编写的代码可以使用这个类。一般情况下CLS对C#代码的影响不会太大。
垃圾收集:垃圾收集器是用来在.NET中进行内存管理。特别是它可以恢复正在运行中的应用程序需要的内存。.NET运行库采用的方法是垃圾收集器,这是一个程序,其目的是清理内存,方法是所有动态请求的内存都分配到堆上,当.NET检测到给定进程的托管堆已满,需要清理时,就调用垃圾收集器处理目前代码中的所有变量,检查对存储在托管堆上的对象的引用,没有引用的对象就不能再从代码中访问,因而被删除。不能保证什么时候会调用垃圾收集器,但可以重写这个过程,在代码中调用垃圾收集器。
安全性:.NET提供的安全机制是基于代码的安全性,而Windows仅提供了基于角色的安全性.
使用异常来处理错误:代码的某些领域被看作是异常处理程序例程,每个例程都能处理某种特殊的错误情况,这些条件可以定义得很宽或很窄。异常结构确保在发生错误情况时,执行进程立即跳到最适合的异常处理程序例程上。
特性的使用:在.NET中,对特性的革新是建立了一个机制,通过该机制可以在源代码中定义自己的特性。
- 程序集
程序集(assembly)是包含编译好的、面向.NET Framework的代码的逻辑单元。它是完全自我描述性的,可以存储在多个文件中,其中会有一个包含入口点的主文件。该文件描述了程序集中的其他文件。它的一个重要特性就是它们包含的元数据描述了对应代码中定义的的类型和方法。
私有程序集是最简单的一中程序集类型。一般附带在某个软件上,且只能用于该软件。因为私有程序集完全是自含式的,所以只需把相应的文件放在文件系统的对应的文件夹中即可(不需要注册表项),这个过程称为“0影响(XCOPY)安装”。
共享程序集是其他应用程序可以使用的公共库。所以需要一定的保护措施来防止名称冲突和版本冲突,解决这个问题的方法就是把共享程序集放在文件系统的一个特定的子目录树中,称为全局程序集高速缓存(GAC)。安装共享程序集需要使用.NET工具专门安装到高速缓存中。为了避免名称冲突,共享程序集应根据私有密钥加密法指定一个名称,称为强名(strong name),并保证其唯一性,它必须经由要引用共享程序集的应用程序来引用。
因为程序集存储了元数据,包括在程序集中定义的所有类型和这些类型的成员的细节,所以可以编程访问这些元数据———反射。
- .NET Framework类
编写托管代码最大的好处就是可以使用.NET基类库。它是一个内容丰富的托管代码类集合。.NET基类的一个优点是他们非常直观和易用。
- 命名空间
命名空间是.NET避免类名称冲突的一种方式。它不过是数据类型的一种组合方式,可以互相嵌套。