2012-04-21 3 views
3

간단한 구문을 사용하여 파생 클래스 필드에 값을 직접 할당하여 초기화하면 컴파일러는 파생 클래스 필드를 초기화 한 다음 base .ctor를 호출하는 IL 코드를 내 보냅니다. 왜 그것은 기본 .ctor 필드를 호출하지 않고 파생 클래스 필드를 초기화합니다. 기본 클래스의 필드에 의존하는 필드가 있으면 어떻게됩니까?기본 클래스 생성자가 먼저 호출되지 않는 이유

여기에 몇 가지 코드 샘플을 넣고 싶지만 휴대 전화에서이 질문을 게시하고 있습니다.

+0

필드는 기본 클래스 필드에 의존 할 수 없으며 필드 자체가 이니셜 라이저에서 'this'를 참조 할 수 없기 때문에 필드도 자체 필드입니다. –

+0

@Anthony, 네,하지만 그것은 OP의 질문의 일부라고 생각합니다. 왜 우리는 고문을 당했고 필드 이니셜 라이저에'this '를 사용할 수 없습니까? (달리, 말하자면, 자바) 나는 두 경우 모두 안전한 코드의 더 강력한 보증을 제공한다고 가정한다. 하지만 때로는 슬픈 일이 있습니다. –

+0

실은 잘 잡습니다. – Tarik

답변

3

가상 메소드 나 인 타ializer가 생성자 내에서 호출되는 경우를 처리해야하기 때문이라고 생각합니다.

+0

'virtual' 메소드가 여기에있는 이유가 될 것 같습니다. 오버라이드 된 경우 기본 클래스의 메서드 내에서 호출 될 수 있으므로 파생 클래스 필드에 도달해야 할 수 있습니다. – Tarik

2

에릭 리 퍼트 (Eric Lippert)는 자신의 블로그에서 2 부작으로 구성됩니다.

http://blogs.msdn.com/b/ericlippert/archive/2008/02/15/why-do-initializers-run-in-the-opposite-order-as-constructors-part-one.aspx

은 그냥 convineance 여기 언급. 희망이 도움이됩니다.

Calling methods on derived types from constructors is dirty pool, but it is not illegal. 

글로벌 상태로 채워지는 개체는 위험하지만 불법은 아닙니다.

관련 문제