属性或 get/set 方法对对象大小的影响
本文关键字:对象 影响 方法 get set 属性 | 更新日期: 2023-09-27 18:00:28
就对象大小而言,如果公开的属性不表示状态,而只是将其getter和setter调用委托给另一个实体,则属性而不是get/set方法如何影响对象大小?
例如,请考虑以下类:
public class Person
{
Address _address = new Address();
public string AddressName
{
get{ return _address.Name; }
set { _address.Name = value; }
}
public string GetAddressName(){ return _address.Name; }
public void SetAddressName(string name){ _address.Name = name; }
}
public Address
{
public string Name { get; set; }
}
我猜在创建新人员时,CLR 在确定要分配的内存量时会考虑 AddressName 属性的潜在大小。 但是,如果我公开的只是 Get/Set AddressName 方法,则不会分配额外的内存来满足 AddressName 属性的需求。 因此,为了节省内存占用,在这种情况下最好使用 Get/Set 方法。 但是,这不会与地址类的 Name 属性产生差异,因为状态正在保留。这个假设正确吗?
单个对象的大小不受属性、方法、事件等数量的影响。它会影响类型元数据和 JITted 代码的大小,但不会影响每个对象的大小。这仅受实例字段的影响。
我猜在创建新人员时,CLR 在确定要分配的内存量时会考虑 AddressName 属性的潜在大小。
不。它只看你的田地。您有一个字段 ( _address
(,因此加上正常的对象开销是单个实例所需的所有内存。
正如 Jon 已经回答的那样,对象实例的大小仅由其实例字段决定。但是,让我更详细地介绍一下。
对象实例至少与其字段大小的总和一样大。根据字段对齐约束和 CLR(公共语言运行库(布局字段的方式,可能需要考虑一些填充字节。对于引用类型,实例有两个额外的隐藏字段:同步块索引和类型引用。两者都是本机整数。在堆上,实例的最小大小为 12 字节(无论它们实际需要多少空间(。
以以下类为例:
class X
{
byte value1;
string value2;
int value3;
long value4;
}
在 32 位系统上,X
实例可能需要 28 个字节:
- 2 乘以 4 字节的同步块索引和类型引用,
- 一个字节表示
byte
, - 三个填充字节,以对齐下一个字段,
- 四个字节用于对象引用
string
, - 另外四个字节用于
int
- 和 8 个字节表示
long
,
如您所见,getter 和 setter、方法和构造函数不会占用每个对象实例中的空间。相反,有一个单独的对象(您称为 Type
(,它维护一个方法列表(getter、setter 和构造函数也是方法(并包含该类型的静态字段。您可以根据需要创建任意数量的类型对象实例,但对于任何给定类型实例,只有一个Type
对象。