2010-02-22 26 views

回答

8

属性在编译时作为元数据输出到程序集。这个元数据然后通过反射在运行时使用 - 例如使用GetCustomAttributes()

编译器在编译时也使用了一些属性。例如,编译器查看AttributeUsageAttribute以确定某个属性是否可用于特定对象。

+1

编译器在编译器时也使用ObsoleteAttribute。 – plinth 2010-02-22 15:18:36

1

属性在编译时编译到代码中,但它们通常在运行时用作触发器以不同方式执行操作。

0

编译器将所谓的元数据添加到装饰有属性的对象。此元数据无论是通过属性还是以其他方式创建,都可以在运行时通过Reflection访问。因此,您可以使用属性进行修饰,然后在程序运行时读取详细信息。但是,要说元数据在编译时被“使用”并不完全正确,因为编译器不关心元数据是什么。

+1

-1:在某些情况下,属性会以有意义的方式影响编译。例如,条件属性主要用于编译期间,如果使用不正确,可能会触发编译器错误。 – Brian 2010-02-22 19:34:18

+0

是的,你是对的......我忘记了这些情况......过时是另一回事。 – 2010-02-22 20:53:19

12

大多数仅在运行时使用。非常有限数目的由编译器使用,包括:

  • [Conditional(...)] - 忽略每生成符号的方法调用
  • [Obsolete(...)] - 发出一个警告/误差作为构建输出
  • [Serializable] - 被写入作为一个CLI标志
  • [Extension] - 用于扩展方法
  • [AttributeUsage] - 影响的属性是如何应用
  • -

编译器在创建程序集文件时使用了诸如[AssemblyVersion],[AssemblyFileVersion]等的一系列内容,以及诸如影响可访问性的[InternalsVisibleTo]之类的内容。

此外,像PostSharp这样的工具可以根据属性做额外的后期编译步骤。

编译器可能会向生成的类型/方法(anon-methods/types,iterator块等)添加一些其他属性。

相关问题