2017-01-14 12 views
1

저는 C#을 처음 접했기 때문에 접근 자 및 개체 이니셜 라이저는 완전히 새로운 개념입니다. 즉, 나는 다음과 같은 예를 제외하고 그들에 괜찮은 핸들을 생각했다 정말 나를 혼란 :개체 및 컬렉션 이니셜 라이저 및 액세스 도구

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

Field :

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 참조) 정확히 예상대로 작동하지만 Coll은 나를 혼란스럽게합니다. setter는 Coll으로 결코 호출되지 않습니다. 이는 Collection Initializers가 Properties와 (또는 최소한 자동 속성이 아닌) Message를 섞지 않는다는 것을 의미합니다. 그러나 그 경우 컴파일 타임 오류가 예상됩니다.

동작의 해당 부분과 관계없이 내게 더 혼란스러운 점은 coll_의 내부 값이 어떻게 든 초기화 자 값으로 설정된다는 것입니다.

나는 Coll의 집합이 호출되지 않는 이유와 C#이 coll_의 값을 설정할 수있는 방법을 알고 싶어합니다. 내부 저장소로 coll_을 식별하기에 충분하도록 Coll의 get 및 set 접근 자에서 해당 식별자를 사용하고 있습니까? 또는 해당 유형의 유일한 멤버이기 때문에 설정 되었기 때문일 수 있습니다.

+0

이 줄은 Coll 설정 기 _Coll = {1, 2, 3, 4, 5}, _ – Steve

+0

을 호출합니다. @ 스티브 그렇지 않습니다. 잠깐, 실제 예제로 질문을 업데이트하십시오. –

+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 }은 공개 설정자가없는 컬렉션 속성을위한 컬렉션 이탤릭 라이저 구문의 한 형태입니다 (그러나 세터가있는 것과 동일하게 작동 함). 이 양식은 Coll이 인스턴스화되도록합니다 (null이 아님). coll_ = new ObservableCollection<int>(); 라인을 생성자로 주석 처리하려고 시도하면 프로그램이 NullReferenceException과 충돌합니다.

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에 설명되어 있습니다

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

그것이 How 생성자에서 이벤트 처리기를 추가 확인