.Net属性功能是在编译时使用还是在运行时使用?

时间:2010-02-22 15:05:18

标签: c# .net attributes

在.Net中,是在编译时或运行时使用的属性功能还是两者兼而有之?你能给我一些例子吗?

4 个答案:

答案 0 :(得分:14)

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

  • [Conditional(...)] - 省略每个构建符号的方法调用
  • [Obsolete(...)] - 发出警告/错误作为构建输出
  • [Serializable] - 写为CLI标志
  • [Extension] - 用于扩展方法
  • [AttributeUsage] - 影响属性的应用方式
  •   -

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

此外,像PostSharp这样的工具会根据属性执行额外的后编译步骤。

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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