2017-01-16 12 views
4

私はを十分に把握していないかもしれません?オペレータはまだ説明できなかった設計上の欠陥に遭遇しました。ヌル合体演算子による初期化?

は、唯一の違いはそこに初期化されるかされ、次の2つのプロパティを比較します。最初は、明示的に初期化、を有する第二ながら?オペレータ(または私はここで間違っているのですか?)。

データ初期化を両方のプロパティで実行すると、最初のプロパティに基づくコレクションが予想通りに読み込まれ、2番目のデータセットはとなります。演算子には決してデータが取り込まれず、コレクションに0個の要素が含まれます。

きっと何かがここに私の仮定で間違っています。ここの欠陥は何ですか?

P.S.基本クラスに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

関連する問題