在.NET中使用属性的性能开销

时间:2009-11-09 21:17:26

标签: c# .net performance reflection attributes

1 ..是否因使用属性而导致性能开销?想想一个类:

    public class MyClass
    {
       int Count {get;set;}
    }

它有10个属性(属性是类,其中属性类本身比MyClass本身大,如:

public class FirstAttribute : Attribute
{
   int A,B,C,D,E,F,G,H,I,J ... {get;set;}
}

2 ..每次MyClass实例化时,其中10个属性是否是内存开销? (FirstAttributeMyClass大小的10倍,将使用其中的10个进行修饰,因此实际对象本身与其上装饰的属性的总大小相比非常小。)是这是一个问题?

3 ..这种情况对于结构是否有任何不同(结构是值类型和属性是引用类型)?

4 ..存储在内存中的属性相对于它们所附着的对象在哪里?他们是如何联系在一起的?

5 ..初始化MyClass或使用反射检索属性时,属性是否已初始化?

2 个答案:

答案 0 :(得分:27)

  1. 在空间方面有一点点开销,但不是很多 - 属性不会影响正常执行。

  2. 不,属性对类型而不是实例起作用,因此您不会通过使用大量“大”属性来占用大量内存。 (我不知道你是为每个具体的类型获得一个泛型,还是每个泛型定义一个 - 我希望后者......)

  3. 不,因为答案为1。

  4. 属性未附加到对象 - 它们附加到类型。我不知道完全的详细信息,它们存储在内存中,但无论如何这都是一个实现细节。

  5. 只有在使用反射时才会初始化属性。

答案 1 :(得分:4)

Jon Skeet绝对正确,我只想提出一个额外的概念:

如果您查看所有属性的基类System.Attribute,您会注意到,其大多数成员都是静态。因此,无论您拥有多少个Attribute实例,它们只存在一次。

这只是另一点强调,属性并不太昂贵......