同一个应用程序中的多个静态变量范围?

时间:2011-10-01 16:01:07

标签: c# .net performance static scope

在同一个应用程序中设置多个静态范围的最佳方法是什么? 我有一些结构用作访问数组的包装器。

以下是一个例子:

class FooClass{
   static int[] BarArray;
}

struct FooStruct{
    public int BarArrayIndex;

    public int BarArrayValue { 
      get { return FooClass.BarArray[BarArrayIndex]; } 
      set { FooClass.BarArray[BarArrayIndex] = value; }
    }
}

出于性能原因,我不想在FooStruct的每个实例中存储对BarArray的引用,因此我声明该数组是静态的。 但是,将来我可能需要同时使用多个不同的BarArrays(结构的不同实例应该指向不同的数组)。有没有办法实现这一点,而不必在结构的每个实例中存储额外的引用而不使用静态变量? 如果没有,那么在将整个应用程序视为最终用户的“一个应用程序”时,使用多个静态实例的最佳方法是什么?

6 个答案:

答案 0 :(得分:5)

你似乎认为持有对数组的引用意味着复制数组..即你的struct的每个实例都包含数组的副本?不是这种情况。所有结构都包含对数组的引用...指针。在内存中只存在一个数组实例。我不确定这是否会让你获得任何表现点。

答案 1 :(得分:2)

你不能。静态的要点是在整个应用程序中有一个实例。

请改为Dependency Injection。它应该完全符合您的用例,并且是处理此类问题的首选方式。

答案 2 :(得分:2)

  

这不仅仅是记忆。每次我创建一个新实例或复制它   (将它传递给方法等)它也会增加一些cpu时间开销。   这是我想要最小化的主要内容

然后使它们成为类对象。然后你只需要传递一个引用,你可以添加一个引用到数组而不会受到惩罚。 (不,在堆上使用1M小对象是一个性能问题)。

但我严重怀疑复制小结构是由剖析器挑选出来的。听起来你在猜测瓶颈在哪里。

答案 3 :(得分:1)

static class FooClass{
    private static int[][] barArrays;

    public static int[] getBarArray(int instanceIndex)
    {
        return barArrays[instanceIndex];
    }
}

struct FooStruct{
    private int instanceIndex;
    public int BarArrayIndex;

    public int BarArrayValue { 
        get { return FooClass.getBarArray[instanceIndex][BarArrayIndex]; } 
        set { FooClass.getBarArray[instanceIndex][BarArrayIndex] = value; }
    }
}

这是Singleton模式的概括。

顺便说一句,每个FooStruct实例保持FooClass的公共实例的性能损失绝对是微不足道的。

答案 4 :(得分:0)

此时您可以做的最好的事情是向FooClass添加一个工厂方法,负责返回BarArray的实例。

class FooClass {
   int[] GetBarArray() {
   }
}

现在,实现此方法以返回静态对象。如果您将来某处决定更改创建阵列的策略,则只需重新实现工厂方法。

答案 5 :(得分:0)

如果您只想拥有多个静态变量,请为每个上下文使用一个新的AppDomain。
但我不确定这是否适合您的问题(参见其他答案)。

  

编辑:   教程和帮助
  http://msdn.microsoft.com/en-us/library/system.appdomain.aspx
  http://www.beansoftware.com/NET-Tutorials/Application-Domain.aspx
  I don't understand Application Domains