【问题标题】:Does class members occupy memory?班级成员是否占用内存?
【发布时间】:2012-06-25 09:18:03
【问题描述】:

一个类通常由成员变量和方法组成。当我们创建类的实例时,会为类的成员变量分配内存。成员方法是否也占用内存?这些方法存储在哪里?

【问题讨论】:

  • 方法实现会占用每个类型的内存(我认为每次使用泛型进行改进?)但这不会增加每个对象实例。例如。 obj.GetType() 返回表示所述方法(以及许多其他内容)的类型。当然,(实例)变量是每个实例的。
  • @pst,为什么要发表评论这么好的答案?
  • @AlexeiLevenkov 提出了一个很好的观点。我肯定会投票赞成,我自己回答了这个问题,我认为这是一个相当不错的答案。
  • @AlexeiLevenkov 因为只是小总结,不完整:)
  • “不,声明的方法不会在每个实例的基础上占用内存”可能是这里最简单的视图...

标签: c# asp.net .net memory


【解决方案1】:

假设我们有以下类:

public class Person
{
   public string Name { get; set; }

   public Person(string name)
   {
        Name = name;
   }

   public string SayName()
   {
      string hello = "Hello! My name is ";
      return hello + name;
   }
}

Person p = new Person("John");
string yourName = p.SayName();

SayName() 函数在Call Stack 上运行,Person p 对象及其属性 (Name) 将保留在内存中,直到 Garbage Collection 进入并清理它。

在内存方面,你应该更关心对象的实例字段(属性),你正在处理的对象的数量,以及你的对象是Reader还是Connection的某个时间。如果您的对象是ReaderConnection,则需要考虑使用using 语句。

伪代码:

using(DatabaseConnection dbConn = new DatabaseConnection()
{
    // Process your calls and data
}
// The object is Disposable and it's resources are cleared 

【讨论】:

  • "SayName() 中的变量,也就是你好,只在函数在作用域内时保留在内存中。所以一旦函数完成,变量就不再在内存中。不完全正确,GC 可以在不再需要引用时立即收集它们(这包括 this!)
  • 是的。这是真实的。我想我应该在访问方面更清楚地说明。
  • ReaderConnection 的某个时间 [原文如此]” - 简单概括为 IDisposable 可能更清楚,IMO
【解决方案2】:

Class 只是一个蓝图,只要没有定义 class 类型的变量,它就不会占用任何空间。一旦定义了类类型的对象/实例,类成员将占用内存中的一些空间。 并且实例的大小等于类中定义的成员的大小之和。

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2018-06-07
    • 2019-08-28
    相关资源
    最近更新 更多