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

标签 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 个都会成为内存开销吗? (FirstAttribute 的大小是 MyClass 的 10 倍,后者将用其中的 10 个进行装饰,因此与要添加的属性的总大小相比,实际对象本身是如此之小装饰在上面。)这是一个问题吗?

3.. 对于结构(结构是值类型,属性是引用类型),这种情况会有什么不同吗?

4.. 与它们所附加的对象相关的属性存储在内存中的什么位置?它们是如何联系在一起的?

5.. 属性是在 MyClass 初始化后立即初始化还是在您使用反射检索它们时初始化?

最佳答案

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

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

  3. 不,因为对 1 的回答。

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

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

关于c# - 在 .NET 中使用属性的性能开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1703876/

相关文章:

javascript - 需要双击复选框进行勾选

C#存储球员卡数据库设计

.net - 如何在代码优先 Entity Framework 中使用 View

c# - 在写入文件时复制文件线程安全吗?

c# - 如何通过其 URL(或其他键)查找 SiteMapNode?

multithreading - Akka如何达到如此高的性能?

c# - 动态创建带有c#代码的javascript数组

C# 在继承的构造函数中初始化 Disposable

c# - .NET MVC 4 - 同一个 Controller 上有多个 "actions",怎么样?

mysql - 简单 InnoDB 表上的简单 MySQL INSERT 查询需要 40+ms