Как убедиться, что данные в статическом классе генерируются и генерируются только один раз? - PullRequest
3 голосов
/ 23 января 2012

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

public static class MyClass
{
    public static List<int> MyList = new List<int>();

    public MyClass()
    {
        for (int i = 0; i < 10; i++)
        {
            MyList.Add(i);
        }
    }
}

Ответы [ 3 ]

6 голосов
/ 23 января 2012
  • Я хочу создать содержимое списка только один раз
  • Я также хочу убедиться, что данные действительно созданы

Ваштекущий код точно гарантирует, что при изменении конструктора на статический:

  static MyClass() { }  // not public or private

Загрузчик класса выполнит инициализацию MyList, прежде чем любой другой член класса может быть выполнен.Это происходит при первом использовании класса.

Наблюдаемое поведение состоит в том, что статические члены инициализируются (один раз) в начале вашего приложения.

Только когда вы создаете что-то, где статические инициализаторы зависят друг от друга, у вас может быть о чем подумать / пережить.

5 голосов
/ 23 января 2012

Для этого вы должны использовать статический конструктор , например:

static MyClass()
{
    for (int i = 0; i < 10; i++)
    {
        MyList.Add(i);
    }
}

Обратите внимание, что статический конструктор не требует и не принимает никаких модификаторов области действия, таких как public и т. Д.

0 голосов
/ 23 января 2012

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

Что-то вроде:

private static List<int> myList;

private static void doInitializeList() {
    myList = new List<int>();
    // fill list here
}

public static List<int> getMyList() {
    if (!_myListInitialized) {
       doInitializeList();
    }
    return myList;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...