【问题标题】:Does C# method take memory?C# 方法是否占用内存?
【发布时间】:2018-02-19 06:49:49
【问题描述】:

当一个类有 50 个方法并且我们创建该类的 50 个对象实例时,内存中会发生什么?对于具有大量功能和更少内存使用的object,最好的解决方案是什么?

【问题讨论】:

  • AFAIK,类的实例只为其字段占用内存(包括自动实现的属性,因为它们被转换为带有支持字段的常规属性)。
  • @ZoharPeled 你是对的。方法通过隐式this 参数或在静态方法不需要上下文的情况下提供它们的上下文,即它们正在处理的实例。这就是为什么不需要为不同的实例复制内存中的方法。属性只是 getter 和 setter 方法,所以同样适用。这会将字段作为实例中的东西占用内存。
  • 旁注:有 50 个方法的类通常被认为是难闻的气味。您可能想查看您的设计,看看所有方法是否确实必须在同一个对象中,并且没有其他方法分组可以使您的 API 易于理解/使用。

标签: c# performance memory memory-management heap-memory


【解决方案1】:

是的,C#/.Net 方法需要基于每个 AppDomain 的内存,方法/属性没有每个实例的成本。

费用来自:

  • 方法元数据(类型的一部分)和 IL。我不确定 IL 会保持加载多长时间,因为它实际上只需要 JIT,所以我猜它会根据需要加载并丢弃。
  • 方法经过 JIT 处理后,机器代码会一直保留到 AppDomain 被卸载(或者如果编译为中性,直到进程终止)

因此,使用 50 个方法实例化 1 或 50 个对象将不需要不同的方法内存量。

【讨论】:

  • 何时为方法分配内存?它是在创建对象时分配的还是在调用方法时分配的?
  • @zulqadaridrishi 不知道(应该在 JIT 时间)/不太可能有人关心。请提出一个新问题(请务必在问题中解释为什么需要该信息)
【解决方案2】:

首先,内存使用和功能不是基于对象,而是基于我们正在创建对象的类...因此,如果您正在创建一个类的对象,您就可以访问所有的功能那个类..在我看来,使用对象访问类功能是一个更好的选择

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 2013-10-21
    • 1970-01-01
    • 2016-02-25
    • 2016-03-05
    • 2011-09-23
    • 2017-11-25
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多