6

它们是存储在类方法还是实例方法中?还是两者兼而有之?我真的在寻找一个解释,经过大量研究,我无法得出一个明确的答案。

谢谢

4

4 回答 4

15

在这里为了精确,程序集中使用的所有 [属性] 都由编译器收集在一起并写入程序集的元数据。元数据中的两个表都起作用。

第一个是 CustomAttribute 表,它包含每个属性的列表。列表条目具有对具有属性 (1) 的原始声明的索引、对属性类型的构造函数的引用 (2) 以及用于在运行时构造属性对象的值的索引 (3)。

第二个是 Blob 表,CustomAttribute 表中的值索引 (3) 索引它。它包含您在属性声明中使用的值。如果使用字符串或 typeof 参数,则这些值是字符串;如果使用值类型值参数,则为实际值;如果使用数组,则为这些值的数组。

因此,在运行时构造属性对象首先需要通过 (1) 在 CustomAttribute 数组中找到条目。然后使用 (2) 找到属性类的构造函数,并在必要时对其进行 jit 编译。(3) 用于查找 blob 表中的条目,根据需要转换 blob 中的值,例如从字符串中检索类型、创建数组等。并调用构造函数来创建对象。

以这种方式组织它具有很大的优势,即声明可以具有任意数量的属性,并且属性可以用于多种声明(程序集、类型、方法、参数、字段等)。缺点是找回它们并不是特别便宜。

于 2013-10-13T12:08:02.270 回答
1

类属性存储在Type与类关联的对象中。

Object x;
System.Reflection.TypeAttributes attributes = x.GetType().Attributes;

因此,您的问题的答案是:实际上两者都不是,因为它们本身不属于此类。

在此处查看更多信息:http: //msdn.microsoft.com/en-us/library/system.type.attributes.aspx

于 2013-10-13T11:30:02.813 回答
1

正如 knittl 在评论中评论的那样(这是正确的),您可以查看此MSDN

.NET Framework 允许您在编译的文件中声明特定种类的元数据,称为属性。属性可以在整个 .NET Framework 中找到,用于更详细地控制程序在运行时的行为方式。此外,您可以通过用户定义的自定义属性将自己的自定义元数据发送到 .NET Framework 文件中。有关详细信息,请参阅使用属性扩展元数据。

来自文档(CLI Partition II - Metadata and File Format (word/pdf zip)):-

类型及其成员的属性将描述性信息附加到它们的定义中。最常见的属性是预定义的,并且在与其关联的元数据中具有特定的编码(第 23 节)。此外,元数据提供了一种将用户定义的属性附加到元数据的方法,使用几种不同的编码。

来自MSDN:

您可以使用 Type 类的成员来获取传递的类中的各个方法和成员。此示例首先查询 Type 对象以获取类级别的属性信息。接下来,它使用 Type.GetMethods 将所有方法的实例放入 System.Reflection.MemberInfo 对象数组中,以检索方法级别的属性信息。您还可以使用 Type.GetProperties 方法检查属性级别的属性,或使用 Type.GetConstructors 方法检查构造函数级别的属性。

于 2013-10-13T11:31:28.017 回答
1

简而言之,它们存储在 中,这是使用IL Disassembler看到的属性IL的示例。 [Serializable]IL在此处输入图像描述

于 2013-10-13T12:23:00.693 回答