同一应用程序中的多个静态变量作用域

本文关键字:静态 变量 作用域 应用程序 | 更新日期: 2023-09-27 18:10:16

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

下面是一个例子:

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同时工作(其中结构体的不同实例应该指向不同的数组)。有没有一种方法可以实现这一点,而不必在结构的每个实例中存储额外的引用,也不使用静态变量?如果不是,那么使用多个静态实例的最佳方法是什么,同时使整个应用程序对最终用户来说就像"一个应用程序"?

同一应用程序中的多个静态变量作用域

您似乎认为持有对数组的引用意味着复制数组。也就是说,你的结构体的每个实例将包含数组的副本?事实并非如此。所有结构体将包含对数组的引用…一个指针。在内存中只存在一个数组实例。

你不能。静态的意义在于在整个应用程序中只有一个实例。

看看依赖注入吧。它应该完全满足您的用例,并且是处理此类问题的首选方法。

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

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

但是我非常怀疑复制小结构是被分析器挑出来的。听起来你好像在猜测瓶颈在哪里。

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实例的性能损失是绝对微不足道的。

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

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

现在,实现这个方法来返回一个静态对象。如果将来某个时候您决定更改创建数组的策略,您只需重新实现工厂方法。

如果你只是想有多个静态变量,为每个上下文使用一个新的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