2013-10-30 7 views
5

List를 속성으로 초기화 할 때 이상한 점을 목격했습니다. 이 작업을 수행 할 때목록 속성의 초기화 프로그램 구문

var stuff = new Stuff(){list = {1, 2, 3} }; 

컴파일되고 해당 목록이 null이라는 오류가 발생합니다. 그래서, 물건의 생성자이 추가 :

public Stuff(){ 
    list = new List<int>(); 
} 

목록은 어떤 의미를 만들기 위해 보이는 지금 {1, 2, 3}을 포함 할 초기화됩니다. 그러나,

public Stuff(){ 
    list = new List<int>(){1, 2, 3}; 
} 

에 생성자를 변경 그래서

var stuff = new Stuff(){list = {4, 5, 6} }; 

목록처럼 초기화하는 것은 오히려 혼란 나를 떠나 {1, 2, 3, 4, 5, 6}를 포함하도록 초기화됩니다.

이렇게 컴파일해서는 안되며 이런 식으로 행동해서는 안됩니다. 여기서 정확히 무슨 일이 일어나고있는거야?

+0

여기 [code] (http://ideone.com/9gtwOC) –

답변

3

이렇게 컴파일하면 안되며 이런 식으로 행동해서는 안됩니다. 여기서 정확히 무슨 일이 일어나고있는거야?

컬렉션 초기화 프로그램은 이니셜 라이저에 전달 된 각 항목에 대해 .Add 메서드를 호출하여 작동합니다. 이 은 생성자에서 미리 채우는 항목에을 추가합니다.

이이 the documentation for Collection Initializers에 설명되어 있습니다 :

컬렉션 이니셜 라이저는 IEnumerable을 구현하는 컬렉션 클래스를 초기화 할 때 하나 개 이상의 요소 이니셜 라이저를 지정할 수 있습니다. 요소 이니셜 라이저는 간단한 값, 표현식 또는 객체 이니셜 라이저가 될 수 있습니다. 컬렉션 이니셜 라이저를 사용하면 소스 코드에서 클래스의 Add 메서드에 대한 호출을 여러 번 지정할 필요가 없습니다. 컴파일러가 호출을 추가합니다. 당신이 볼 수 있듯이

var temp = new Stuff(); 
temp.list.Add(4); 
temp.list.Add(5); 
temp.list.Add(6); 
Stuff stuff = temp; 

에서, stuff 변수가 일반적으로 생성자를 호출합니다 (1, 2을 추가하고, 3) :

이 컴파일러가 비슷한으로 두 번째 전화를 회전 의미 그런 다음 다른 항목을 추가하면 표시되는 결과가 발생합니다.

3

collection initializer으로 초기화하고 있습니다. 이 작품이 방법은 설명서에 나와있다 :

컬렉션 이니셜 라이저는 IEnumerable를 구현하는 컬렉션 클래스를 초기화 할 때 하나 이상의 요소 이니셜 라이저를 지정할 수 있습니다. 요소 이니셜 라이저는 간단한 값인 식 또는 개체 이니셜 라이저 일 수 있습니다. 컬렉션 이니셜 라이저 을 사용하면 소스 코드에서 클래스의 Add 메서드에 대한 호출을 여러 번 지정할 필요가 없습니다. 컴파일러가 호출을 추가합니다.

var temp = new Stuff(); 
temp.list.Add(1); 
temp.list.Add(2); 
temp.list.Add(3); 
stuff = temp; 

그것은이 listNullReferenceException 경우 원인이 방법을 쉽게 알 수 null 방법 :

var stuff = new Stuff(){list = {1, 2, 3} }; 

가 속기 방식이 글을 쓰는 것입니다 :이 즉

, 목록에있는 기존 항목에 추가합니다 (있는 경우).

+0

@ReedCopsey : 캐치를 주셔서 감사합니다 - 나는 그것을 고쳤으며 이제는 당신과 같습니다 : *) – Jon