代码之家  ›  专栏  ›  技术社区  ›  J.W.

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

  •  11
  • J.W.  · 技术社区  · 15 年前

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

    4 回复  |  直到 11 年前
        1
  •  8
  •   Daniel Brückner    11 年前

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

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

        2
  •  14
  •   Marc Gravell    15 年前

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

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

    有一系列的事情 [AssemblyVersion] , [AssemblyFileVersion] 编译程序在创建程序集文件时使用的等,以及 [InternalsVisibleTo] 影响可及性。

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

    编译器可以将一些其他属性添加到生成的类型/方法(对于anon方法/类型、迭代器块等)。

        3
  •  1
  •   ConsultUtah    15 年前

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

        4
  •  0
  •   Michael Bray    15 年前

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