C# .Net属性功能是在编译时使用还是在运行时使用,或者两者都使用?

C# .Net属性功能是在编译时使用还是在运行时使用,或者两者都使用?,c#,.net,attributes,C#,.net,Attributes,在.Net中,属性特性是在编译时使用还是在运行时使用,或者两者都使用?你能给我一些例子吗?属性在编译时被编译到代码中,但它们通常在运行时被用作触发器来执行不同的操作。编译器将所谓的元数据添加到用属性修饰的对象中。无论是通过属性还是其他方式创建的元数据,都可以在运行时通过访问。因此,您可以使用属性进行修饰,然后在程序运行时读取详细信息。但是,说元数据在编译时被“使用”并不完全正确,因为编译器并不关心元数据是什么。属性在编译时作为元数据输出到程序集。然后在运行时通过反射使用此元数据-例如使用 编译器

在.Net中,属性特性是在编译时使用还是在运行时使用,或者两者都使用?你能给我一些例子吗?

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

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

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

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

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

  • [条件(…)]
    -忽略每个生成符号的方法调用
  • [过时(…)]
    -生成输出时发出警告/错误
  • [Serializable]
    -作为CLI标志写入
  • [扩展]
    -用于扩展方法
  • [AttributeUsage]
    -影响属性的应用方式
  • -
编译器在创建程序集文件时会使用一系列内容,如
[AssemblyVersion]
[AssemblyFileVersion]
等,以及影响可访问性的
[InternalsVisibleTo]

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


编译器可能会向生成的类型/方法(对于非方法/类型、迭代器块等)添加一些其他属性。

编译器在编译时也会使用ObsoleteAttribute。-1:在某些情况下,属性会以有意义的方式影响编译。例如,Conditional属性主要用于编译时,如果使用不正确,可能会触发编译器错误。。。我忘了那些案子了。。。过时是另一个原因。