在.Net中,是编译时还是运行时使用的属性特性?你能举几个例子吗?在编译时或运行时使用.Net属性特性还是两者都使用?
回答
属性在编译时作为元数据输出到程序集。这个元数据然后通过反射在运行时使用 - 例如使用GetCustomAttributes()
。
编译器在编译时也使用了一些属性。例如,编译器查看AttributeUsageAttribute
以确定某个属性是否可用于特定对象。
属性在编译时编译到代码中,但它们通常在运行时用作触发器以不同方式执行操作。
编译器将所谓的元数据添加到装饰有属性的对象。此元数据无论是通过属性还是以其他方式创建,都可以在运行时通过Reflection访问。因此,您可以使用属性进行修饰,然后在程序运行时读取详细信息。但是,要说元数据在编译时被“使用”并不完全正确,因为编译器不关心元数据是什么。
-1:在某些情况下,属性会以有意义的方式影响编译。例如,条件属性主要用于编译期间,如果使用不正确,可能会触发编译器错误。 – Brian 2010-02-22 19:34:18
是的,你是对的......我忘记了这些情况......过时是另一回事。 – 2010-02-22 20:53:19
大多数仅在运行时使用。非常有限数目的由编译器使用,包括:
[Conditional(...)]
- 忽略每生成符号的方法调用[Obsolete(...)]
- 发出一个警告/误差作为构建输出[Serializable]
- 被写入作为一个CLI标志[Extension]
- 用于扩展方法[AttributeUsage]
- 影响的属性是如何应用 -
编译器在创建程序集文件时使用了诸如[AssemblyVersion]
,[AssemblyFileVersion]
等的一系列内容,以及诸如影响可访问性的[InternalsVisibleTo]
之类的内容。
此外,像PostSharp这样的工具可以根据属性做额外的后期编译步骤。
编译器可能会向生成的类型/方法(anon-methods/types,iterator块等)添加一些其他属性。
- 1. app.config仅在编译时使用,还是在运行时需要?
- 2. C++编译时和运行时可用的名称属性
- 3. 编译器或运行时Install4J属性/变量
- 4. 平台特定库的运行时间还是编译时间?
- 5. C# - 在运行时确定属性是Type还是Object实例?
- 6. 在运行时更改.NET属性网格只读属性
- 7. 在运行时编译并使用类
- 8. 编译时传递给运行时客户端GWT的属性?
- 9. 在运行时编辑i18属性
- 10. 编译时间多态性与运行时多态性
- 11. 运行时间依赖性与编译时间依赖性
- 12. 使用sqlite3时编译错误:具有'retain(或strong)'属性的属性必须是对象类型
- 13. 是否可以使用ExpandoObject创建运行时属性?
- 14. 自定义属性或特殊属性还是这种模式?
- 15. 得到在编译时(或运行时)
- 16. 使用spring-boot时是否可以使用spring-boot命令行属性:运行?
- 17. 运行时间编译VS时间(.NET)
- 18. SASS/SCSS - 简单`显示:none`属性,都会在编译时炒
- 19. 什么是运行时间和编译时间多态性?
- 20. 用户定义文字是在编译时还是运行时解决的?
- 21. 它是编译时多态还是运行时?
- 22. 是泛型运行时还是编译时多态?
- 23. 使用反射在运行时创建类型的属性上添加属性
- 24. 使用DataContractSerializer时忽略运行时的一些属性
- 25. 运行时的FireMonkey属性编辑器
- 26. 使用名称空间会影响性能还是编译时间?
- 27. 是否可以在运行时修改属性的属性?
- 28. 编译错误。使用属性struct
- 29. 使用EF查询编译时未知属性
- 30. 使用编译时安全从C++更改QML属性
编译器在编译器时也使用ObsoleteAttribute。 – plinth 2010-02-22 15:18:36