2010-01-07 6 views
29

나는 C# 3 초기화 구문을 좋아하고 많이 사용하지만, 오늘 반사경을보고있는 동안, 다음 내놓았다 : 처음에는이니셜 구문

var binding = new WSHttpBinding 
{ 
    ReaderQuotas = { MaxArrayLength = 100000 }, 
    MaxReceivedMessageSize = 10485760 
}; 

나는 그것이 실수라고 생각하지만, 컴파일 않습니다 ! 아직도 새로운 것들을 항상 배우고있는 것 같아요. :)

MaxArrayLengthReaderQuotas 속성의 속성을 WSHttpBinding으로 설정합니다.

이 구문은 새 ReaderQuotas 개체를 만들고 속성을 설정합니까, 아니면 속성을 이미 초기화했다고 가정합니까? 이것이 '자식'속성을 초기화하는 데 사용하는 일반적인 방법입니까? 내가 구문에게 혼란을 조금 발견 할

...

+0

[이 게시물] (http : //www.codeducky.org/even-concise-c-object-initializers /),이 유형의 이니셜 라이저에 대한 의미 및 사용 사례에 대해 설명합니다. – ChaseMedallion

답변

22

는 아니, 당신은 = new SomeType {...}을 사용하지 않는 새로운 객체를 생성하지 않는 :

var binding = new WSHttpBinding 
{ 
    ReaderQuotas = new XmlDictionaryReaderQuotas { MaxArrayLength = 100000 }, 
    MaxReceivedMessageSize = 10485760 
}; 

귀하의 예제의 속성을 설정하기위한 초기화 구문을 보여줍니다 기존 하위 개체 콜렉션에 "Add"메소드를 호출하는 것과 유사한 구문도 있습니다.

var binding = new WSHttpBinding(); 
binding.ReaderQuotas.MaxArrayLength = 100000; 
binding.MaxReceivedMessageSize = 10485760; 
+0

구문 상 다른 점이 있습니까? 보이는 것처럼 (ReaderQuotas WSHttpBinding의 생성자에서 초기화되지 않은 경우) 그것은 예외를 throw해야합니다 – James

+0

고마워, 그냥 놀라움에 의해 나를 데려 갔다 :) 나는 당신이 컬렉션 이니셜 라이저를 의미하는 '추가'로 가정? – leppie

+0

@james : 나는 예외를 예상하지만, 소스 코드를 가지고 있지 않다면 생성자에서 무엇이 완료되는지 알지 못한다면 혼란 스러울 수 있습니다. 일부 생성자 오버로드는 해당 속성을 초기화하거나 초기화하지 않을 수 있으므로 더 많은 혼란을 초래할 수 있습니다. – leppie

14

그것은 조금 혼란, 동의 :

이 코드는 크게 비교입니다.

섹션의 7.6.10.2를 읽어야합니다. 그것은 모두 로 설명되어 있습니다. 예를 들어

등호 필드 또는 속성에 할당 동일한 방식으로 처리 후 기호 표현을 지정하는 초기화 부재.

등호 이후 기호 객체 이니셜을 지정하는 초기화 부재, 즉 내장 객체의 초기화 중첩 객체 이니셜, 이다. 새 값을 필드 나 속성에 할당하는 대신 중첩 된 객체 이니셜 라이저의 할당은 필드 또는 속성의 구성원에 대한 할당으로 처리됩니다. 중첩 된 개체 이니셜 라이저는 값이 인 속성에 을 적용하거나 값 유형이 인 읽기 전용 필드에 적용 할 수 없습니다.

등호 뒤에 컬렉션 이니셜 라이저를 지정하는 멤버 이니셜 라이저는 포함 컬렉션의 초기화입니다. 필드 또는 속성에 새 컬렉션을 할당하는 대신 초기화 도구에서 요소는 속성이 참조하는 컬렉션에 추가됩니다.