2012-06-02 2 views
2

내가이 클래스를 가지고 말 :생성자 체인 우선

class FooBar 
{ 
    public FooBar() : this(0x666f6f, 0x626172) 
    { 
    } 

    public FooBar(int foo, int bar) 
    { 
     ... 
    } 
... 
} 

나는이 한 경우 : 매개 변수가없는 생성자가 먼저 실행할 것, 다음 매개 변수 중 하나, 또는 그것이 다른

FooBar foobar = new FooBar(); 

입니다

을 길 주변에?

+2

닫습니다 투표를 모든 사람 : 당신이 var t = new Test()으로 기본 생성자를 호출 할 경우

public class Test { public Test() : this(5) { Console.WriteLine("no params"); } public Test(int i) : this("Hi") { Console.WriteLine("integer=" + i.ToString()); } public Test(string str) { Console.WriteLine("string=" + str); } } 

, 당신은 다음과 같은 출력이 표시됩니다

은 다음과 같이 3 생성자가 클래스 내에 가정 이 질문은 [C# 생성자 실행 순서] (http://stackoverflow.com/questions/1882692/c-sharp-constructor-execution-order)의 정확한 복제본입니다. 링크 된 질문은'base' 키워드에 대해 묻습니다. 이 질문은'this' 키워드에 관해 묻습니다. – Douglas

답변

5

MSDNbase와 유사한 예를 갖는 생성자 블록 실행 전에 본 예에서는

기본 클래스의 생성자가 호출된다.

그럼에도 불구하고, 여기에 확실히 내 테스트입니다 :

class Program 
{ 
    public Program() : this(0) 
    { 
     Console.WriteLine("first"); 
    } 

    public Program(int i) 
    { 
     Console.WriteLine("second"); 
    } 

    static void Main(string[] args) 
    { 
     Program p = new Program(); 
    } 
} 

인쇄

second 
first 

는 명시 적으로 하나를 호출하기 전에 너무 매개 변수가있는 생성자가 실행됩니다.

+0

당신의 마지막 코드 예제 : 물론, 심지어 _before_'' second "'이 출력되는'base()'생성자는 기본 클래스 인 System.Object'의 zero-parameter 인스턴스 생성자입니다. –

3

컨트롤이 먼저 기본 생성자에 도달합니다. 거기에서 매개 변수화 된 생성자를 호출하면 기본 생성자에서 명령문이 실행이 중지되고 매개 변수화 된 생성자로 제어가 이동합니다. 매개 변수화 된 생성자에서 명령문의 실행이 완료되면 컨트롤이 기본 생성자로 돌아갑니다.

기본 생성자에 중단 점을 배치하여 확인할 수 있습니다.

+3

클래스 변수가 처음에 초기화 된 다음 체인 된 생성자가 생성 된 다음 기본 생성자 중괄호 사이에 코드가 작성됩니다. – Ruben

1

"정의 된 동작"으로 문서화되어 있는지 알 수는 없지만 TestClass(int)이 먼저 실행되고 TestClass()이 실행됩니다.

public class Manager : Employee 
{ 
    public Manager(int annualSalary) 
     : base(annualSalary) 
    { 
     //Add further instructions here. 
    } 
} 

및 상태 :

1

생성자는 생성자가 기본을 (매개 변수화) 또는 기본이 아닌되고 함께 할 수 없다라고하지만, 오히려이 관계를 체인에 의해 결정되는 순서.

자세한 내용은 this 키워드가 뒤에 오는 모든 생성자가 중지되고 프로그램이 this 키워드가 가리키는 생성자로 점프합니다. 마지막으로 체인화 된 생성자에 도달하면 해당 코드가 실행됩니다. 그런 다음 프로그램은 체인에서 이전 생성자를 실행하고 이것은 첫 번째로 다시 돌아갑니다.

예를 들어 명확하게 설명합니다.

// string=Hi -> The last .ctor 
// integer=5 -> Second .ctor 
// no params -> First .ctor