Статический элемент личных данных, не инициализированный в статическом классе?

StackOverflow https://stackoverflow.com//questions/22079523

Вопрос

Учитывая приведенный ниже код C #, я ожидал, что участник с личными данными _ Хранилище пользовательских данных должен быть немедленно инициализирован.Вместо этого я нахожу, что это вообще не инициализируется.Я ставлю точку останова в операторе инициализации, и она никогда не выполняется.Это означает, что статическое свойство DB всегда возвращает NULL.Работают ли статические классы иначе, чем нестатические классы?

public static class UserDataStorageWrapper
{
    private static UserDataStorage _userDataStorage = new UserDataStorage();

    public static UserDataStorage DB
    { 
        get
        {
            return _userDataStorage;
        }
    }
}

Я изменю код, чтобы проверить наличие NULL, и пока сам инициализирую _userDataStorage.Но я хочу быть уверенным в своих ожиданиях здесь.

Это было полезно?

Решение

Попробуйте добавить статический конструктор и инициализировать переменную внутри.

public static class UserDataStorageWrapper
{
    public static UserDataStorageWrapper()
    {
        _userDataStorage = new UserDataStorage();
    }

    private static UserDataStorage _userDataStorage;

    public static UserDataStorage DB
    { 
        get
        {
            return _userDataStorage;
        }
    }
}

"Если в классе существует статический конструктор, выполнение инициализаторы статических полей происходит непосредственно перед выполнением этого статического конструктор" Источник

Другие советы

Поскольку это статический инициализатор, он будет инициализирован « при зависимом времени реализации до первого использования статического поля этого класса ». Источник

Так что ваша точка останова может не ударить , если только вы не используете это поле (или другое статическое поле в этом классе).


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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top