2013-02-22 6 views
2

C#을 처음 접 하시면서 생성자 체이닝을 살펴보십시오.C# 생성자 체인 : 적절한 사용?

나는 다음과 같은 클래스가 : 나는 이렇게 인스턴스화 경우

class ConstructorChaining 
{ 
    public string a; 
    public string b; 
    public int c; 

    public ConstructorChaining(string astring, string anotherstring, int anint) 
    { 
     a = astring; 
     b = anotherstring; 
     c = anint; 
    } 

    public ConstructorChaining(string astring) : this("fff", astring, 2) 
    { 
     a = astring; 
    } 
} 

, 출력 필드의 값 :

값 "XYZ"가 cc2.a 않는 이유
ConstructorChaining cc2 = new ConstructorChaining("xyz"); 
Console.WriteLine(cc2.a); 
Console.WriteLine(cc2.b); 
Console.WriteLine(cc2.c); 

을, "fff"가 아닌가요? 나는 단지 cc2라고 생각했을 것이다. b이이 값을 얻습니다.

많은 감사

답변

0

당신이 다른 생성자를 호출 후 a = astring을 설정하기 때문에, 그래서 값을 덮어 쓰게됩니다 .

4

은 "체인"생성자는 생성자의 몸체 전에 실행됩니다.

그래서 먼저 3 개의 매개 변수를 사용하여 "fff"a에 생성자로 할당합니다.
해당 생성자가 실행을 마친 후 하나의 매개 변수가있는 생성자 본문이 실행되고 "xyz"a에 할당합니다.

class ConstructorChaining 
{ 
    public string a; 
    public string b; 
    public int c; 

    public ConstructorChaining(string astring, string anotherstring, int anint) 
    { 
     a = astring; 
     b = anotherstring; 
     c = anint; 
    } 

    public ConstructorChaining(string astring) : this(astring, astring, 2) 
    { 
    } 
} 
0
this("fff", astring, 2) 

실행하여 XYZ 생성자 전 :

다음은 연쇄 생성자의 합리적인 구현 될 것이다. 그래서 cc2.a는 valye의 FFF를 가지며 1 파라미터 생성자의 바디가 실행하기 전에 3 파라미터 생성자가 실행되기 때문에 다음은 XYZ

class ConstructorChaining 
{ 
    public string a; 
    public string b; 
    public int c; 

    public ConstructorChaining(string astring, string anotherstring, int anint) 
    { 
     a = astring; 
     b = anotherstring; 
     c = anint; 
    } 

    public ConstructorChaining(string astring) : this("fff", astring, 2) 
    { 
     //This code will be executed After your 3 param constructor. 
     a = astring; 
    } 
} 
0

으로 덮어. 이 같은

public ConstructorChaining(string astring) 
{ 
    this("fff", astring, 2) 
    a = astring; 
} 

하지 :

는 의사 코드에서 그것은 다음과 같습니다

public ConstructorChaining(string astring) 
{ 
    a = astring; 
    this("fff", astring, 2) 
} 
0

수퍼 클래스 생성자를 호출 한 후 생성자에서 구현을 실행하므로 cc2.a를 "xyz"로 대체합니다. 하나 개의 파라미터 (만약 부르는)와 생성자 가 = "FFF"가 는 B = "XYZ" C = 2 이 완료 설정

a = astring;  // = fff 
b = anotherstring; // = xyz 
c = anint;   // = 2 
a = astring;  // = xyz 
0

이유는 다음과 같이 최종 완료 단계에서 은 3 개의 매개 변수를 가진 생성자에 의해. 그 후 one-parameter-contructor는 a = "xyz"를 설정합니다.