类的属性存储在?

时间:2013-10-13 11:25:13

标签: c#

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

由于

4 个答案:

答案 0 :(得分:14)

在这里求精度,程序集中使用的所有[属性]都由编译器收集在一起并写入程序集的元数据。元数据播放中的两个表是角色。

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

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

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

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

答案 1 :(得分:1)

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

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

所以你的问题的答案是:真的没有这些,因为他们不是这类课程的一部分。

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

答案 2 :(得分:1)

正如knittl在评论中所评论的(这是正确的)你可以查看MSDN

  

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

来自docs (CLI分区II - 元数据和文件格式(word / pdf zip)): -

  

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

来自MSDN:

  

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

答案 3 :(得分:1)

简而言之,它们存储在IL中,这是使用IL Disassembler看到的[Serializable]IL属性的示例。 enter image description here