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

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或使用reflection检索属性,属性是否已初始化?

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

  2. 不,属性作用于类型,而不是实例,因此您不会通过使用大量“大”属性来占用大量内存。 (我不知道你是为每个具体类型获得一个generics,还是每个generics定义一个 – 我期待后者……)

  3. 不,因为答案1。

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

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

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

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

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