在同一个应用程序中设置多个静态范围的最佳方法是什么? 我有一些结构用作访问数组的包装器。
以下是一个例子:
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(结构的不同实例应该指向不同的数组)。有没有办法实现这一点,而不必在结构的每个实例中存储额外的引用而不使用静态变量? 如果没有,那么在将整个应用程序视为最终用户的“一个应用程序”时,使用多个静态实例的最佳方法是什么?
答案 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