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

C# 类中的属性/方法是否占用内存空间?,c#,function,object,memory,properties,C#,Function,Object,Memory,Properties,如果我们有这样的代码: public class Enemy { public int hp; } public class Enemy { public int hp; public void Attack() {} } public int Hp { get; set; } 然后一个敌人对象将在32位机器中占用4个字节,在64位机器中占用8个字节(如果我错了,请纠正我) 如果我们把它改成这样: public class Enemy { public int hp

如果我们有这样的代码:

public class Enemy
{
   public int hp;
}
public class Enemy
{
   public int hp;
   public void Attack() {}
}
public int Hp { get; set; }
然后一个
敌人
对象将在32位机器中占用4个字节,在64位机器中占用8个字节(如果我错了,请纠正我)

如果我们把它改成这样:

public class Enemy
{
   public int hp;
}
public class Enemy
{
   public int hp;
   public void Attack() {}
}
public int Hp { get; set; }
一个
敌人
对象仍然会占用与以前相同的内存量,对吗

这一点也一样:

public class Enemy
{
   private int hp;
   public int Hp { get { return hp; } set { hp = value; } }
}
据我所知,属性是函数,但作为变量处理,对吗

因此,如果我们这样做:

public class Enemy
{
   public int Hp { set; get; }
}
这是否意味着一个
敌人
对象现在根本不占用内存空间?那没有任何意义

甚至就这一点而言:

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

有人能解释一下吗?

public int Hp{set;get;}
means-AUTOgenerate变量及其访问方法,所以这个变量将占用空间,与您手动定义它一样

更多详情:


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

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

比如:

将按计划实施

public class Enemy
{
   private int _hp;

   public int Hp 
   { 
       get { return _hp; }
       set { _hp = value; }
   }
}
另外,添加额外的方法将使用额外的内存,但不是每个实例。 看:

int
在C#中永远是
系统。Int32
无论是32位还是64位应用程序,它都会占用4字节的空间

但是,对象中还有额外的开销。Jon Skeet在博客中详细介绍了这一点

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

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

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

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

然后编译器将自动创建一个备份字段,用于保存该属性的值,这将再次占用空间。

谢谢。但是我的第二个例子呢,我有一个函数和一个变量,需要多少内存?(我想这将与我的第三个例子中的数量相同,对吗?)哦,是的,我看过你的编辑,是的,我记得读过。所以,就像代码(函数)占用相同的空间,即使我有很多对象。这是有意义的,因为它只是代码,它们都使用它,所以我猜它是在对象之间共享的,对吗?嗯,从你给我的链接:“类字段存储在堆中”是真的吗,即使是对于简单的数据类型,如int、float等?我以为那些人就住在那堆里。但是我想,既然类对象本身存在于堆中,那就是为什么它的所有成员都在堆中,因为它们都在堆中,对吗?类是引用类型。(因为当您新建一个类时,在堆上分配了内存)。这就是为什么它们的字段在堆上(甚至是值类型字段)。只有结构(包含valuetyped文件)在声明为局部变量时才存在于堆栈上。值类型的值(如结构和您称之为“普通数据类型”)存储在声明的位置,除非进行了优化。如果它们被声明为局部变量,则它们可能位于堆栈或寄存器中,除非它们是在闭包、迭代器块或异步方法(实际上是类)中声明的。如果它们在类中声明为intance字段,则它们将存储在某个堆上的对象中。请至少参阅-类的每个实例都需要至少一个指向它的指针,否则它将被垃圾收集。还有更多关于框架开销的信息,这些信息各不相同。每个方法所需的内存量因实现而异。试图解释像这样的语言中使用的每个字节可能非常困难,因为您无法直接控制它。你为什么要知道?或者只是关于汽车的属性?我只是想了解这东西是如何工作的。我最初要求了解房产。但由于它们类似于函数,我也想了解它们。
对象在32位机器中需要4个字节,在64位机器中需要8个字节(如果我错了,请纠正我)
对此不确定。无论您运行的是32位还是64位,
int
都将是4个字节,这就是为什么它被命名为
Int32
。我想你把
IntPtr
int
搞混了。如果我错了,请纠正我谢谢你的回答。