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

Joa*_*nge 13 .net c# reflection performance attributes

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

    public class MyClass
    {
       int Count {get;set;}
    }
Run Code Online (Sandbox Code Playgroud)

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

public class FirstAttribute : Attribute
{
   int A,B,C,D,E,F,G,H,I,J ... {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

2 ..每次MyClass实例化这些属性中的10个是内存开销吗?(FirstAttribute其大小的10倍MyClass将用其中的10个装饰,因此使实际对象本身与其上装饰的属性的总大小相比这么小.)这是一个问题吗?

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

4 ..存储在内存中的属性与它们所附着的对象有关吗?他们是如何联系在一起的?

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

Jon*_*eet 29

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

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

  3. 不,因为答案1.

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

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


Kna*_*bax 5

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

如果您查看所有属性的基类 System.Attribute,您会注意到,它的大多数成员都是static。所以它们只存在一次,不管你有多少个 Attribute 实例。

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