Несколько областей статических переменных в одном приложении? - PullRequest
2 голосов
/ 01 октября 2011

Каков наилучший способ настроить несколько статических областей в одном приложении?У меня есть структуры, которые служат оболочками для доступа к массиву.

Вот пример:

class FooClass{
   static int[] BarArray;
}

struct FooStruct{
    public int BarArrayIndex;

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

Из соображений производительности я не хочу хранить ссылку на BarArray в каждом экземпляреFooStruct, поэтому я объявил массив статическим.Тем не менее, возможно, что в будущем мне придется работать с несколькими различными BarArrays одновременно (где разные экземпляры структуры должны указывать на разные массивы).Есть ли способ добиться этого без необходимости хранить дополнительную ссылку в каждом экземпляре структур и не использовать статическую переменную?Если нет, то как лучше всего использовать несколько статических экземпляров, при этом все приложение будет восприниматься как «одно приложение» для конечного пользователя?

Ответы [ 6 ]

5 голосов
/ 01 октября 2011

Вы, кажется, думаете, что удержание ссылки на массив означает копирование массива, т. Е. Что каждый экземпляр вашей структуры будет содержать копию массива?Это не вариант.Вся структура будет содержать ссылку на массив ... указатель.Там будет только один экземпляр массива в памяти.Я не уверен, что это приносит вам какие-либо очки производительности.

2 голосов
/ 01 октября 2011

Это не только память.Каждый раз, когда я создаю новый экземпляр или копирую его (передаю его методу и т. Д.), Он также добавляет время процессора.Это главное, что я хотел бы минимизировать

Затем сделайте их объектами класса.Тогда вам нужно только передать ссылку, и вы можете добавить ссылку в массив без штрафа.(И нет, использование 1M маленьких объектов в куче - это , а не проблема производительности).

Но я серьезно сомневаюсь, что копирование небольших структур было выделено профилировщиком.Звучит так, как будто вы угадываете, где находится узкое место.

2 голосов
/ 01 октября 2011

Вы не можете. Смысл статики в том, чтобы иметь один экземпляр для всего приложения.

Взгляните на Dependency Injection . Он должен полностью соответствовать вашему сценарию использования и является предпочтительным способом решения такой проблемы.

1 голос
/ 01 октября 2011
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; }
    }
}

Это обобщение паттерна синглтона.

Кстати, снижение производительности для каждого экземпляра FooStruct для удержания общего экземпляра FooClass абсолютно тривиально.

0 голосов
/ 01 октября 2011

Если вы просто хотите иметь несколько статических переменных, используйте новый домен приложений для каждого контекста.
Но я не уверен, что это правильное решение для вашей проблемы (см. Другие ответы).

EDIT: Учебники и полезные
http://msdn.microsoft.com/en-us/library/system.appdomain.aspx
http://www.beansoftware.com/NET-Tutorials/Application-Domain.aspx
Я не понимаю домены приложений

0 голосов
/ 01 октября 2011

Лучшее, что вы можете сделать в этот момент, это добавить фабричный метод в FooClass, отвечающий за возврат экземпляра BarArray.

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

Пока что реализуйте этот метод для возврата статического объекта.Если где-то в будущем вы решите изменить политику создания массива, вы просто переопределите фабричный метод.

...