C#属性和元数据含义

时间:2010-03-24 15:57:19

标签: c# performance attributes xna metadata

我从网上阅读有关C#属性和元数据的教程。这很酷,但我想知道它的含义。

  1. 加载程序集时是否加载了(自定义)属性?或者仅当您使用反射来检索元数据时?

  2. 似乎属性增加了代码大小的总和,因为它被编译成可执行文件?这是对的吗?

  3. 是否可以拥有编译时属性?即只有在定义了DEBUG时才会应用属性?

  4. 我知道要这样做:

    #if DEBUG
    [MyCustomAttribute]
    #endif
    

    但我想知道是否有更好的方法?

    1. 使用大量属性时是否有任何性能/内存警告?我的目标平台将是Xbox 360(使用C#/ XNA)。
    2. 谢谢!

      -Stephanus

3 个答案:

答案 0 :(得分:6)

属性有两部分,它们的代码及其构造函数参数和属性数据。代码存储在程序集的IL中,数据存储在程序集元数据中。如果未使用某个属性,则只占用一些虚拟内存空间,但不需要任何计算机资源。

在使用GetCustomAttributes()方法之前没有任何反应。然后,属性类的代码即时编译,就像程序集中的常规代码一样。使用元数据中的属性数据调用构造函数和属性setter。当内存管理器映射IL,机器代码和元数据页时,你会用掉两​​个RAM。

答案 1 :(得分:4)

1)AFAIK属性是惰性实例化的,但它们随附于内存中 2)没有足够的担心。 Knuth等 3)是的。

使用属性意味着使用反射,它可以在框架中执行的一些最慢的事情中进行排序。但那么,你的申请是否太慢?在不知道你在做什么的情况下,更不用说你需要在多少毫秒内做什么,没有人可以给你一个是或否答案。

最好的事情是制作一个原型并看看它是什么样的IRL。再一次,Knuth等。

答案 2 :(得分:3)

  1. 加载程序集时会加载属性。它们是类型信息的一部分,因此会自动加载类型。
  2. 在具有属性的装配尺寸方面存在(非常小的)成本。然而,这是非常小的,而不是我会关注的事情。
  3. 您可以这样做,但只能以您展示的方式进行。
  4. 拥有属性不会影响性能。它们在运行时被忽略,除非使用反射来显式查询属性。