2017-01-14 6 views
1

私はC#の初心者ですから、アクセサーとオブジェクト初期化子はまったく新しい概念です。オブジェクトとコレクションの初期化子とアクセサリー

using System; 
using System.Collections.ObjectModel; 

class How { 
    public ObservableCollection<int> Coll { 
     get { return coll_; } 
     set { 
      Console.WriteLine("Setter for Coll Called!"); 
      coll_.Clear(); 
      foreach (int i in value) 
       coll_.Add(i); 
     } 
    } 

    public string Field { 
     get { return field_; } 
     set { 
      Console.WriteLine("Setter for field called"); 
      field_ = value; 
     } 
    } 

    // To confirm the internal coll_ is actually set 
    public void Test() { 
     foreach(int i in coll_) 
      Console.Write(i + " "); 
    } 

    public How() { 
     coll_ = new ObservableCollection<int>(); 
     field_ = ""; 
    } 

    private ObservableCollection<int> coll_; 
    private string field_; 
} 

public class Test { 
    public static void Main() { 
     var how = new How { 
      Coll = { 1, 2, 3, 4, 5 }, 
      Field = "Test Field", 
     }; 

     Console.Write("Coll: "); 
     foreach (int i in how.Coll) 
      Console.Write(i + " "); 
     Console.WriteLine(); 

     Console.WriteLine("Field: " + how.Field); 


     Console.Write("Internal coll_: "); 
     how.Test(); 
     Console.WriteLine(); 
    } 
} 

上記のコードの出力がされた(実際の例hereを参照してください):

Setter for field called 
Coll: 1 2 3 4 5 
Field: Test Field 
Internal coll_: 1 2 3 4 5 

Fieldそれは言った、私は次の例を除き、それらの上大丈夫ハンドルは本当に私を混乱さがあると思います私が期待している通りに動作しますが、Collは私を混乱させます。設定者はCollに決して呼び出されません。これは、コレクション初期化子がプロパティと(または少なくとも少なくとも自動プロパティではない)意志を混同しないことを意味します。しかし、そうであれば、私はコンパイル時のエラーが予想されます。

動作のその部分にかかわらず、さらに私に混乱を招くのは、coll_の内部値がどうにか初期値に設定されるということです。

私はなぜCollのセットが呼び出されないのか、またC#がどのようにcoll_の値を設定できるのかを知ることに興味があります。内部ストレージとしてcoll_を識別するためにC#で十分であるように、Collのgetおよびsetアクセサでその識別子を使用しているかどうか。対応するタイプの唯一のメンバーなので設定されている可能性があります。

+0

この行は、Coll設定ツール_Coll = {1、2、3、4、5}、_ – Steve

+0

を呼び出します。@ Steveそれはありません。ホールドオン、ライブサンプルで質問を更新する。 –

+0

@Steve質問に[こちら](http://ideone.com/rcYE1Y)のライブサンプルを追加しました。 –

答えて

1
var how = new How 
      { 
       Coll = { 1, 2, 3, 4, 5 }, 
       Field = "Test Field", 
      }; 

これはHowクラスのオブジェクト初期化構文です。

Coll = { 1, 2, 3, 4, 5 }は、公共セッターを持っていないコレクションプロパティのために意味の収集・itializer構文の形式である(しかし、セッターを持っているものと同様に動作します)。このフォームは、Collがインスタンス化されるために必要です(nullではありません)。coll_ = new ObservableCollection<int>();の行をコンストラクタに書き込むと、プログラムはNullReferenceExceptionでクラッシュします。それはHowコンストラクタでイベントハンドラを追加確認する

Coll.Add(1); 
Coll.Add(2); 
Coll.Add(3); 
Coll.Add(4); 
Coll.Add(5); 

Coll = { 1, 2, 3, 4, 5 }を繰り返しColl.Add呼び出しに翻訳され

public How() 
{ 
    coll_ = new ObservableCollection<int>(); 

    coll_.CollectionChanged += (o,e) => 
    { Console.WriteLine("New items: {0}", String.Join (",", e.NewItems.OfType<int>())); }; 

    field_ = ""; 
} 

コレクション初期化子は、C#言語仕様の§7.6.10.3に記述されている

関連する問題