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

J.W*_*.W. 11 .net c# attributes

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

Mar*_*ell 14

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

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

有一系列的喜欢的东西[AssemblyVersion],[AssemblyFileVersion]等了由编译器产生的汇编文件时使用的,事情就是这样[InternalsVisibleTo]影响辅助功能.

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

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


Dan*_*ner 9

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

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