类中的属性/方法是否会占用内存空间?

时间:2013-10-14 07:45:44

标签: c# function object memory properties

如果我们有这样的代码:

public class Enemy
{
   public int hp;
}

然后Enemy对象将在32位机器中占用4个字节,在64位中占用8个字节(如果我错了则纠正我)。

如果我们将其更改为以下内容:

public class Enemy
{
   public int hp;
   public void Attack() {}
}

Enemy对象仍然会占用与之前相同的内存量,对吗?

同样如此:

public class Enemy
{
   private int hp;
   public int Hp { get { return hp; } set { hp = value; } }
}

据我所知,属性是函数,但是作为变量对待,对吧?

所以,如果我们这样做:

public class Enemy
{
   public int Hp { set; get; }
}

这是否意味着,Enemy对象现在根本没有内存空间?这没有任何意义。

甚至就此而言:

public class Enemy
{
   public void DoSomething() { }
}

有人可以解释一下吗?

3 个答案:

答案 0 :(得分:4)

无论32位还是64位应用程序,C#中的

int始终为System.Int32,总是占用4个字节的空间。

但是,对象中还有额外的开销。 Jon Skeet有一篇博文,详细介绍了其中的一些内容,Of memory and strings

如您所见,即使没有字段,当以32位运行时,对象的基本大小为12个字节。

然而,你是对的,因为具有代码的属性不一定会增加对象的大小。

但是,如果你把它变成一个自动属性,就像这样:

public int Hp { get; set; }

然后编译器将自动为您创建一个支持字段,以保存该属性的值,这将再次占用空间。

答案 1 :(得分:1)

public int Hp { set; get; }表示 - AUTO生成变量及其访问方法,因此该变量占用空间,与手动定义相同。

更多详情:

您的代码被编译成任何类型的二进制代码(纯机器代码或字节代码) - 因此,您的代码在HD存储期间或在RAM中运行期间总是占用一些内存,对于每个实例class,在运行期间为这个类的变量分配额外的内存,所以你的所有类都占用内存,没有变量的类为每个实例使用几乎0的额外内存,但是每个实例都可以有一些“技术”数据,比如vrtbl,通常 - 所有类和所有对象都需要一些内存

答案 2 :(得分:1)

public int Hp { set; get; }是一个自动实现的属性,将在编译时生成一个私有字段。

像:

public class Enemy
{
   public int Hp { set; get; }
}

将实施为。

public class Enemy
{
   private int _hp;

   public int Hp 
   { 
       get { return _hp; }
       set { _hp = value; }
   }
}

同时添加额外的方法将使用额外的内存,但不是 per-instance 。 看:Where are methods stored in memory?