2017-01-16 58 views
4

我可能沒有把握好??運營商尚未解決,並且遇到了我無法解釋的設計漏洞。使用空合併運算符進行初始化?

比較以下兩個屬性,唯一的區別是如何進行初始化:第一個顯式初始化,第二個是用?操作員(或者我在這裏做錯了嗎?)。

如果我運行具有兩個屬性的數據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" 
    }); 
} 
+2

第二個實際上從未設置內收集,除非你手動設置它的價值,所以,除非你做它會在您每次設法得到它時返回一個新的'ObservableCollection'實例。 – Abion47

+0

Aaaah!這解釋了它。 – user2921851

回答

4

第二個從不初始化您的領域,但總是返回一個新的集合。試試這個來代替:

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

''''運算符有一個令人困惑的優先級,但在編譯之前需要在括號中包含賦值。 – Abion47

+0

當然!當你知道答案時,它很清楚,我可以清楚地看到它!謝謝。我的FLAW是我從來沒有爲_userNameColl設置值,只是返回一個實例。那真是愚蠢! – user2921851