【C#语言规范版本5.0学习】1.1程序结构
◇◆C# 中的组织结构的关键概念是程序 (program)、命名空间 (namespace)、类型 (type)、成员 (member) 和程序集 (assembly)。
C# 程序由一个或多个源文件组成。程序中声明类型,类型包含成员,并且可按命名空间进行组织。
类和接口就是类型的示例。字段 (field)、方法、属性和事件是成员的示例。在编译 C# 程序时,它们被物理地打包为程序集。
◇◆程序集是一个抽象的概念,不同的编译选项会产生不同形式的程序集。程序集是通过编辑器(将源代码文件给翻译成一个计算机可识别的二进制程序)将后缀为.cs(C#)和.vb(VB)类型的文件编译后所产生的。以文件个数来区分的话,那么就分单文件程序集(即一个文件)和多文件程序集(多个文件)。而不论是单文件程序集还是多文件程序集,其总有一个核心文件,就是表现为后缀为.dll或.exe格式的文件,具体取决于它们是实现应用程序 (application) 还是实现库 (library)。它们都是标准的PE格式的文件,主要由4部分构成:
- 1.PE头,即Windows系统上的可移植可执行文件的标准格式
- 2.CLR头,它是托管模块特有的,它主要包括
- 1)程序入口方法
- 2)CLR版本号等一些标志
- 3)一个可选的强名称数字签名
- 4)元数据表,主要用来记录了在源代码中定义和引用的所有的类型成员(如方法、字段、属性、参数、事件...)的位置和其标志Flag(各种修饰符)
正是因为元数据表的存在,VS才能智能提示,反射才能获取MemberInfo,CLR扫描元数据表即可获得该程序集的相关重要信息,所以元数据表使得程序集拥有了自我描述的这一特性。clr2中,元数据表大概40多个,其核心按照用途分为3类: - 1.即用于记录在源代码中所定义的类型的定义表:ModuleDef、TypeDef、MethodDef、ParamDef、FieldDef、PropertyDef、EventDef,
- 2.引用了其它程序集中的类型成员的引用表:MemberRef、AssemblyRef、ModuleRef、TypeRef
- 3. 用于描述一些杂项(如版本、发布者、语言文化、多文件程序集中的一些资源文件等)的清单表:AssemblyDef、FileDef、ManifestResourceDef、ExportedTypeDef
- 3.IL代码(也称MSIL,后来被改名为CIL:Common Intermediate Language通用中间语言),是介于源代码和本机机器指令中间的代码,将通过CLR在不同的平台产生不同的二进制机器码。
- 4.一些资源文件
多文件程序集的诞生场景有:比如想为.exe绑定资源文件(如Icon图标),或者想按照功能以增量的方式来按需编译成.dll文件。 通常很少情况下才会将源代码编译成多文件程序集,并且在VS IDE中总是将源代码给编译成单文件的程序集(要么是.dll或.exe)
◇◆由于程序集是一个自描述的功能单元,它既包含代码又包含元数据,因此,C# 中不需要 #include 指令和头文件。若要在 C# 程序中使用某特定程序集中包含的公共类型和成员,只需在编译程序时引用该 程序集即可。
C# 允许将一个程序的源文本存储在多个源文件中。
在编译多个文件组成的 C# 程序时,所有源文件将一 起处理,并且源文件可以自由地相互引用 — 从概念上讲,就像是在处理之前将所有源文件合并为一个 大文件。
C# 中从不需要前向声明,因为除了极少数的例外情况,声明顺序无关紧要。
C# 不限制一个源文件只能声明一个公共类型,也不要求源文件的名称与该源文件中声明的类型匹配。