C# 详解特性

元数据

    在过去,以一种语言编写的软件组件(.exe 或 .dll)不能方便地使用以另一种语言编写的软件组件。 在这个问题的解决上,COM 向前迈进了一步。 .NET Framework 允许编译器向所有的模块和程序集发出附加的说明性信息,从而使组件互用更加简单。 这种叫做“元数据”的信息有助于组件无缝交互。
    元数据是一种二进制信息,用以对存储在公共语言运行时可迁移可执行文件 (PE) 文件或存储在内存中的程序进行描述。 将您的代码编译为 PE 文件时,便会将元数据插入到该文件的一部分中,而将代码转换为 Microsoft 中间语言 (MSIL) 并将其插入到该文件的另一部分中。 在模块或程序集中定义和引用的每个类型和成员都将在元数据中进行说明。 当执行代码时,运行时将元数据加载到内存中,并引用它来发现有关代码的类、成员、继承等信息。
    元数据以非特定语言的方式描述在代码中定义的每一类型和成员。 元数据存储以下信息:
  • 程序集的说明
    • 标识
    • 导出的类型
    • 该程序集所依赖的其他程序集
    • 运行所需的安全权限
  • 类型的说明
    • 名称、可见性、基类和实现的接口
    • 成员(方法、字段、属性、事件、嵌套的类型)。
  • 特性
    • 修饰类型和成员的其他说明性元素。

特性

    如果您使用过 C++,或许对包含关键字(如 public 和 private)的声明比较熟悉,这些关键字提供有关类成员的其他信息。 另外,这些关键字通过描述类成员对其他类的可访问性来进一步定义类成员的行为。 由于编译器被显式设计为识别预定义关键字,因此传统上您没有机会创建自己的关键字。 但是,公共语言运行时允许您添加类似关键字的描述性声明(称为特性)来批注编程元素,如类型、字段、方法和属性。

    为运行时编译代码时,该代码被转换为 Microsoft 中间语言 (MSIL),并同编译器生成的元数据一起被放到可迁移可执行 (PE) 文件的内部。 特性使您得以向元数据中放置额外的描述性信息,并可使用运行时反射服务提取该信息。 当您声明从 System.Attribute 派生的特殊类的实例时,编译器会创建特性。

    .NET Framework 出于多种原因使用特性并通过它们解决若干问题。 特性描述如何将数据序列化,指定用于强制安全性的特性,并限制实时 (JIT) 编译器的优化,从而使代码易于调试。 特性还可以记录文件名或代码作者,或在窗体开发阶段控制控件和成员的可见性。

    可使用特性以几乎所有可能的方式描述代码,并以富有创造性的新方式影响运行时行为。 使用特性可以向 C#、Visual C++、Microsoft Visual Basic 2005 或其他任何以运行时为目标的语言添加自己的描述性元素,而不必重新编写编译器。
展开阅读全文

没有更多推荐了,返回首页