在.Net中,是在编译时或运行时使用的属性功能还是两者兼而有之?你能给我一些例子吗?
答案 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 访问。因此,您可以使用属性进行装饰,然后在程序运行时读取详细信息。但是,要说元数据在编译时“被使用”并不完全正确,因为编译器不关心那些元数据。