使用null合并运算符进行初始化?

时间:2017-01-16 11:26:16

标签: c#

我可能没有很好地掌握 ??运营商但遇到了一个我无法解释的设计缺陷。

比较以下两个属性,唯一的区别是如何初始化:第一个显式初始化,而第二个与??操作员(或者我在这里做错了吗?)。

如果我使用这两个属性运行数据init,那么基于第一个属性的集合将按预期填充,而第二个属性将填充 ??运算符永远不会被填充,并在集合中提供0个元素。

我的假设当然有些不对劲;这里的缺陷是什么?

P.S。请忽略 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 个答案:

答案 0 :(得分:4)

第二个永远不会初始化您的字段,但始终返回一个新集合。试试这个:

public ObservableCollection<UserName> UserNameColl
{
    get { return _userNameColl ?? (_userNameColl = new ObservableCollection<UserName>()); }
    set { Set(ref _userNameColl, value); }
}