【问题标题】:Does declaring too many methods in a class make it larger?在一个类中声明太多方法会使其变大吗?
【发布时间】:2016-03-19 20:00:56
【问题描述】:

我有一个 C# 类,我需要用它来实例化数百万个对象。因此,我需要使课程重量轻且速度超快。我在其中声明了一些函数。所以我担心的是,声明所有这些函数会使类变慢或消耗更多内存。我还可以选择将这些函数声明到另一个类中。这是课程:

internal class Var
{
    public dynamic data;
    public int index;
    public VarTypes type;
    public bool doClone = false;
    public Var Clone(bool doClone)
    {
        var tmpVar = Clone();
        tmpVar.doClone = doClone;
        return tmpVar;
    }
    public Var Clone()
    {
        if (doClone)
            return new Var() { data = data, index = index, type = type };
        else
            return this;
    }
    public void Clone(Var old)
    {
        this.data = old.data;
        this.index = old.index;
        this.type = old.type;
    }
    public override string ToString()
    {
        if (type == VarTypes.Function)
        {
            StringBuilder builder = new StringBuilder("function ");
            if (data.Count == 4)
                builder.Append(data[3].ToString());
            builder.Append("(");
            for (int i = 1; i < data[1][1].Count; i++)
                builder.Append(data[1][1][i].ToString() + ",");
            if (builder[builder.Length - 1] == ',')
                builder.Remove(builder.Length - 1, 1);
            builder.Append(")");
            return builder.ToString();
        }
        else
            return data.ToString();
    }
}

【问题讨论】:

  • 如果这是工作代码,那么它在这里是题外话,应该在 Code Review Stack Exchange 中,人们批评并提出改进其他工作代码的建议。
  • 我投票结束这个问题,因为它属于代码审查codereview.stackexchange.com
  • 不,这不是工作代码。我正在编码中。突然间,这个问题让我印象深刻。
  • 如果您需要速度,您应该使用值类型。大小将主要由字段决定,请参阅此 q:stackoverflow.com/questions/3694423/… 很多方法会增加程序集大小,但我认为它不会增加堆上的大小 - 如果我发现其他情况,我会在这里发回。
  • 不,一个方法不能让一个类对象变重,每个对象只有一个。只有字段和自动属性可以。

标签: c# function class


【解决方案1】:

您的类实例不会因为向类添加更多方法而消耗更多内存。一个类实例具有a constant minimum size,然后它的大小仅在您添加字段(或自动属性,即每个自动属性为您添加一个字段的意义上)时才会增加。这是因为当您实例化一个类时,您实际上是在实例化一个(大部分)仅包含该实例字段值的内存区域。

存在最小大小是因为每个类实例都存储了一些enables various operations of the runtime 的信息,例如GC。此信息主要以指向运行时的类型范围内部结构的指针的形式存储,这意味着它们不会随着类实例的数量而扩展 - 无论您是否存储类型的方法,您都将获得相同的固定开销实例化零个或一千个实例。

【讨论】:

    【解决方案2】:

    来自another answer,如果您担心函数调用开销,请为每个方法启用积极内联:

    // in mscorlib.dll so should not need to include extra references
    using System.Runtime.CompilerServices; 
    
    ⋮
    
     [MethodImpl(MethodImplOptions.AggressiveInlining)]
     void MyMethod(...)
    

    【讨论】:

      猜你喜欢
      • 2022-09-24
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 2014-01-31
      • 2012-06-17
      相关资源
      最近更新 更多