【发布时间】:2011-05-12 12:51:52
【问题描述】:
这可能是一个愚蠢的问题,但是对象属性是否占用每个实例的内存?
据我所知,当您实例化一个对象时,每个值字段占用其大小,而引用字段类型每个字段占用 4 个字节。但是假设您有一个具有 1000 个属性的对象,它通过其他对象获取数据,这些属性本身是否占用任何内存?
自动属性自然会这样做,因为它只是语法糖,但看起来普通属性不应该......
【问题讨论】:
标签: c# memory-management
这可能是一个愚蠢的问题,但是对象属性是否占用每个实例的内存?
据我所知,当您实例化一个对象时,每个值字段占用其大小,而引用字段类型每个字段占用 4 个字节。但是假设您有一个具有 1000 个属性的对象,它通过其他对象获取数据,这些属性本身是否占用任何内存?
自动属性自然会这样做,因为它只是语法糖,但看起来普通属性不应该......
【问题讨论】:
标签: c# memory-management
在这方面,属性就像普通的方法。
代码需要存储在某个地方(每个类型一次),并且任何使用的字段(自动属性!)都需要存储在每个实例中。局部变量也会占用一些内存。
一些例子:
private int myProperty;
public int MyProperty { get => myProperty; set => myProperty; }
属性本身不占用实例内存,但myProperty当然会。
public int MyProperty { get; set; }
我没有定义任何支持字段,但编译器为我做了 - 所以生成的支持字段仍然占用实例内存。
public int Count => somelist.Count;
这里没有额外的支持字段,所以这不需要任何额外的实例内存(当然someList 除外)。
【讨论】:
直接来自 Apress Illustrated C#
Unlike a field, however, a property is a function member.
- It does not allocate memory for data storage!
【讨论】:
不,属性只是 getter 和 setter 方法的语法糖。只有支持字段占用内存。如果您没有支持字段,您将没有每个实例的内存使用情况。
【讨论】:
如果您通过例如reflector 查看已编译的 C# 类,您将看到编译器实际上将属性转换为 get 和 set 方法,自动属性被转换为带有支持字段的 get 和 set 方法,因此该字段将占用与常规字段一样多的空间
【讨论】:
属性被翻译成两个(或者如果你只提供了一个 getter 或者可能是一个 setter 的情况下只是一个)方法,即
public int MyProp
{
get { return 1; }
set { myField = value; }
}
在编译过程中被翻译(可能 Eric Lipper 会纠正我,因为可能是在预处理阶段或某事)成方法
public int Get_MyProp();
public int Set_MyProp(int value);
总而言之,除了对象中包含的其他方法之外,它们没有其他开销
【讨论】: