Инициализация с нуль-объединяющим оператором?

Я не могу иметь хорошее представление о ?? Оператор еще и столкнулся с недостатком дизайна, который я не мог объяснить.

Сравните следующие два свойства, единственное отличие состоит в том, как они инициализируются: первое явно инициализируется, а второе с?? оператор (или я здесь не так делаю?).

Если я запускаю 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); }
}
Другие вопросы по тегам