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
搞混了。如果我错了,请纠正我谢谢你的回答。