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

vex*_*exe 3 c# memory properties function object

如果我们有这样的代码:

public class Enemy
{
   public int hp;
}
Run Code Online (Sandbox Code Playgroud)

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

如果我们把它改成这样:

public class Enemy
{
   public int hp;
   public void Attack() {}
}
Run Code Online (Sandbox Code Playgroud)

一个Enemy对象仍然会像以前一样占用相同数量的内存,对吗?

同样的:

public class Enemy
{
   private int hp;
   public int Hp { get { return hp; } set { hp = value; } }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,属性是函数,但被视为变量,对吗?

所以如果我们这样做:

public class Enemy
{
   public int Hp { set; get; }
}
Run Code Online (Sandbox Code Playgroud)

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

甚至这个,就此而言:

public class Enemy
{
   public void DoSomething() { }
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

ang*_*son 5

intSystem.Int32无论是 32 位还是 64 位应用程序,在 C# 中总是会占用 4 个字节的空间。

但是,对象中有额外的开销。Jon Skeet 有一篇博文详细介绍了这里的一些内容,内存和字符串

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

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

但是,如果您将其设为自动属性,如下所示:

public int Hp { get; set; }
Run Code Online (Sandbox Code Playgroud)

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