Инициализация с нуль-объединяющим оператором?
Я не могу иметь хорошее представление о ?? Оператор еще и столкнулся с недостатком дизайна, который я не мог объяснить.
Сравните следующие два свойства, единственное отличие состоит в том, как они инициализируются: первое явно инициализируется, а второе с?? оператор (или я здесь не так делаю?).
Если я запускаю init данных с обоими свойствами, коллекция, основанная на первом свойстве, заполняется, как и ожидалось, а вторая с ?? оператор никогда не заполняется и в коллекции появляется 0 элементов.
Конечно, что-то здесь не так в моем предположении; в чем здесь недостаток?
PS Пожалуйста, игнорируйте метод Set, который предназначен для реализации INotifyPropertyChanged в базовом классе и не имеет отношения к этой проблеме (которая ограничена типом инициализации).
// свойство версия 1
private ObservableCollection<UserName> _userNameColl = new ObservableCollection<UserName>();
public ObservableCollection<UserName> UserNameColl
{
get { return _userNameColl; }
set { Set(ref _userNameColl, value); }
}
// свойство версии 2
private ObservableCollection<UserName> _userNameColl;
public ObservableCollection<UserName> UserNameColl
{
get { return _userNameColl ?? new ObservableCollection<UserName>(); }
set { Set(ref _userNameColl, value); }
}
// простой класс для создания коллекции объектов
public class UserName
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
// простой тест, заполняющий коллекцию
for (int i = 0; i < 4; i++)
{
// silly data init just for test
UserNameColl.Add(new UserName()
{
Name = $"UserName No {i}",
Age = 20 + i,
Email = $"email{i}@local.lan"
});
}
1 ответ
Второй никогда не инициализирует ваше поле, но всегда возвращает новую коллекцию. Попробуйте это вместо этого:
public ObservableCollection<UserName> UserNameColl
{
get { return _userNameColl ?? (_userNameColl = new ObservableCollection<UserName>()); }
set { Set(ref _userNameColl, value); }
}