在.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个属性是否是内存开销? ( FirstAttribute
是MyClass
大小的10倍,将使用其中的10个进行修饰,因此实际对象本身与其上装饰的属性的总大小相比非常小。)这是一个问题吗?
3 ..这种情况对于结构是否有任何不同(结构是值类型和属性是引用类型)?
4 ..存储在内存中的属性与它们所附着的对象有何关系? 他们是如何联系在一起的?
5 ..一旦初始化MyClass
或使用reflection检索属性,属性是否已初始化?
-
在空间方面有一点点开销,但不是很多 – 属性不会妨碍正常执行。
-
不,属性作用于类型,而不是实例,因此您不会通过使用大量“大”属性来占用大量内存。 (我不知道你是为每个具体类型获得一个generics,还是每个generics定义一个 – 我期待后者……)
-
不,因为答案1。
-
属性未附加到对象 – 它们附加到类型。 我不知道它们存储在内存中的确切位置的细节,但无论如何这都是一个实现细节。
-
只有在使用reflection时才会初始化属性。
Jon Skeet是绝对正确的,我只想提出一个额外的概念:
如果您查看所有属性的基类System.Attribute,您会注意到,它的大多数成员都是静态的 。 因此,无论您拥有多少个Attribute实例,它们只存在一次。
这只是另一点强调,属性不是太昂贵……