【问题标题】:Performance overhead of using attributes in .NET在 .NET 中使用属性的性能开销
【发布时间】:2010-12-14 19:16:15
【问题描述】:

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 初始化后立即初始化还是在您使用反射检索它们时初始化?

【问题讨论】:

    标签: c# .net performance reflection attributes


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

    2. 不,属性作用于类型,而不是实例,因此使用大量“大”属性不会占用大量内存。 (我不知道你是每个 concrete 类型获得一个泛型,还是每个泛型类型定义一个 - 我希望是后者......)

    3. 不,因为 1 的答案。

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

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

    【讨论】:

    • 谢谢乔恩,你真快。我现在明白了。
    • 属性只是引用类型的对象,因此它们被实例化并以与任何其他对象完全相同的方式存储在内存中。
    【解决方案2】:

    Jon Skeet 是绝对正确的,我只想补充一个概念:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-16
      • 2011-10-14
      • 2016-12-19
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 2013-02-09
      相关资源
      最近更新 更多