【问题标题】:Does Properties increase memory size of Instances?属性会增加实例的内存大小吗?
【发布时间】:2011-05-12 12:51:52
【问题描述】:

这可能是一个愚蠢的问题,但是对象属性是否占用每个实例的内存?

据我所知,当您实例化一个对象时,每个值字段占用其大小,而引用字段类型每个字段占用 4 个字节。但是假设您有一个具有 1000 个属性的对象,它通过其他对象获取数据,这些属性本身是否占用任何内存?

自动属性自然会这样做,因为它只是语法糖,但看起来普通属性不应该......

【问题讨论】:

    标签: c# memory-management


    【解决方案1】:

    在这方面,属性就像普通的方法。

    代码需要存储在某个地方(每个类型一次),并且任何使用的字段(自动属性!)都需要存储在每个实例中。局部变量也会占用一些内存。

    一些例子:

    private int myProperty;
    public int MyProperty { get => myProperty; set => myProperty; }
    

    属性本身不占用实例内存,但myProperty当然会。

    public int MyProperty { get; set; }
    

    我没有定义任何支持字段,但编译器为我做了 - 所以生成的支持字段仍然占用实例内存。

    public int Count => somelist.Count;
    

    这里没有额外的支持字段,所以这不需要任何额外的实例内存(当然someList 除外)。

    【讨论】:

    • 这是有道理的,只是必须确保。代理对象 ftw :) 我认为你是第一个
    【解决方案2】:

    直接来自 Apress Illustrated C#

    Unlike a field, however, a property is a function member.
    - It does not allocate memory for data storage!
    

    【讨论】:

      【解决方案3】:

      不,属性只是 getter 和 setter 方法的语法糖。只有支持字段占用内存。如果您没有支持字段,您将没有每个实例的内存使用情况。

      【讨论】:

        【解决方案4】:

        如果您通过例如reflector 查看已编译的 C# 类,您将看到编译器实际上将属性转换为 get 和 set 方法,自动属性被转换为带有支持字段的 get 和 set 方法,因此该字段将占用与常规字段一样多的空间

        【讨论】:

          【解决方案5】:

          属性被翻译成两个(或者如果你只提供了一个 getter 或者可能是一个 setter 的情况下只是一个)方法,即

          public int MyProp
          {
              get { return 1; }
              set { myField = value; }
          }
          

          在编译过程中被翻译(可能 Eric Lipper 会纠正我,因为可能是在预处理阶段或某事)成方法

          public int Get_MyProp();
          public int Set_MyProp(int value);
          

          总而言之,除了对象中包含的其他方法之外,它们没有其他开销

          【讨论】:

            猜你喜欢
            • 2011-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-23
            • 2019-05-02
            相关资源
            最近更新 更多