Статический элемент личных данных, не инициализированный в статическом классе?
-
24-12-2019 - |
Вопрос
Учитывая приведенный ниже код 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;
}
}
}
"Если в классе существует статический конструктор, выполнение инициализаторы статических полей происходит непосредственно перед выполнением этого статического конструктор" Источник
Другие советы
Поскольку это статический инициализатор, он будет инициализирован « при зависимом времени реализации до первого использования статического поля этого класса ». Источник
Так что ваша точка останова может не ударить , если только вы не используете это поле (или другое статическое поле в этом классе).
Для полноты Я могу добавить, что если есть статический конструктор, анициализаторы статического поля будут выполнены перед статическим конструктором.