C# 使用空合并运算符初始化?

C# 使用空合并运算符初始化?,c#,C#,我可能没有很好地掌握??操作员遇到了我无法解释的设计缺陷 比较以下两个属性,唯一的区别在于如何初始化:第一个是显式初始化的,而第二个是??接线员(或者我做错了吗?) 如果我使用这两个属性运行data init,则基于第一个属性的集合将按预期填充,而基于第二个属性的集合将按预期填充??运算符从不填充,并且在集合中出现0个元素 我的假设肯定有问题;这里的缺陷是什么 注意:请忽略Set方法,该方法用于在基类中实现INotifyPropertyChanged,与此问题无关(仅限于初始化类型) //属性版

我可能没有很好地掌握??操作员遇到了我无法解释的设计缺陷

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

如果我使用这两个属性运行data init,则基于第一个属性的集合将按预期填充,而基于第二个属性的集合将按预期填充??运算符从不填充,并且在集合中出现0个元素

我的假设肯定有问题;这里的缺陷是什么

注意:请忽略Set方法,该方法用于在基类中实现INotifyPropertyChanged,与此问题无关(仅限于初始化类型)

//属性版本1

private ObservableCollection<UserName> _userNameColl = new ObservableCollection<UserName>();
public ObservableCollection<UserName> UserNameColl
{
    get { return _userNameColl; }
    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"
    });
}
for(int i=0;i<4;i++)
{
//愚蠢的数据初始化只是为了测试
UserNameColl.Add(新用户名()
{
Name=$“用户名编号{i}”,
年龄=20+1岁,
Email=$“Email{i}@local.lan”
});
}

第二个选项从不初始化字段,但总是返回一个新集合。试试这个:

public ObservableCollection<UserName> UserNameColl
{
    get { return _userNameColl ?? (_userNameColl = new ObservableCollection<UserName>()); }
    set { Set(ref _userNameColl, value); }
}
public observetecollection UserNameColl
{
获取{return\u userNameColl???(\u userNameColl=newobserveCollection());}
set{set(ref_userNameColl,value);}
}

除非您手动设置内部集合,否则第二个集合不会实际设置其值,因此,除非您手动设置,否则每次尝试获取它时,它都会返回一个新的
ObservableCollection
实例。aaaaah!这就解释了。
??
运算符的优先级令人困惑,但在编译之前,您需要将赋值括在括号中。当然!当你知道答案,我能看得很清楚时,它就非常清楚了!!非常感谢。我的缺陷是,我从未设置_userNameColl的值,只是返回一个实例。这太傻了!
public ObservableCollection<UserName> UserNameColl
{
    get { return _userNameColl ?? (_userNameColl = new ObservableCollection<UserName>()); }
    set { Set(ref _userNameColl, value); }
}