2010-06-21 5 views
2

은 - 다음 코드를 가지고 : 나에게C# - 변수를 선언하기 전에 변수를 사용하는 생성자는 어떻게 만들 수 있습니까? 내 질문을 바탕으로

class Nevermore60Customer: GenericCustomer 
{ 
    public Nevermore60Customer(string name, string referrerName) 
    : base (name) 
    { 
     this.referrerName = referrerName; 
    } 
    private string referrerName; 
    private uint highCostMinutesUsed; 

, 그것은이 생성자에 전달 된 매개 변수로 참조되는 "후"초기화되는 변수 "referrrerName을"가 나타납니다.

public Nevermore60Customer(string name, string referrerName) 

나는 어때? 또는 내가 옳고 생성자에서 참조 된 후에 초기화되는 경우 어떻게 가능합니까?

감사

답변

4

생성자 C 번호에 무관 비해 변수 선언의 위치.

그것은 당신이 비록 매개 변수 및 필드에 다른 이름이 있다면 논의 할이 쉽게 만들 것입니다 : 생성자를 호출하기 전에

class Test 
{ 
    public Test(string parameter) 
    { 
     this.field = parameter; 
    } 

    private string field; 
} 

는 기본적으로 필드가 "존재". 필드가이 같은 이니셜로 선언 된 경우 :
private string field = "default value"; 

는 그 초기화는 소스 코드 내 뒤에 올 수에도 불구하고, 전에 에게 생성자를 실행됩니다.

+0

"NeverMore60Customer"클래스를 선언하고 F11을 사용하여 코드를 실행하는 코드에 중단 점을 넣으면 여기에 어떤 일이 발생했는지 설명하는 데 도움이 될 수 있습니다. –

0

잘 모르겠습니다. 생성자에는 referrerName이라고도하는 private 클래스 변수에 할당하는 strign 매개 변수 인 referrerName이 있습니다. this.referrerName이 초기화되기 전에 참조되는 부분이 표시되지 않습니까?

0

this.referrerNameprivate string referrerName;
= 오른쪽의 referrerName 선언 반원 지칭하는 생성자 파라미터이다.

0

클래스의 private 멤버와 생성자를 정렬하는 방법에 관계없이 private 멤버가 항상 먼저 초기화됩니다.

0

C#은 객체 지향 언어이므로 일반 C 절차 언어 개념과 C#을 혼동하는 것처럼 보입니다. C와는 달리 C#에서는 액세스하기 전에 인스턴스가 초기화되고 범위 내에있는 한 선언 순서는 중요하지 않습니다.

+0

선언 순서 *가 중요 할 수 있습니다. 특히 이니셜 라이저는 텍스트 순서로 실행됩니다 ... 부분 클래스가있을 때 잘못 정의됩니다. 당연히 이것에 의존하는 것은 거의 항상 버그이지만 차이를 만들 수 있습니다. * 메소드 * (또는 생성자 또는 속성 등)의 위치는 내가 알고있는 정의되지 않은 차이를 만들지 않습니다. –

+0

그러나 이들은 모두 초기화되고 생성자 전에 사용 가능합니다. –

2

생성자 인수가 이 아니고 필드의 별칭입니다. 필드 이름을 숨기면이 코드는 작동하지 않습니다.

public Nevermore60Customer(string name, string referrerName) : base (name) 
    { 
     referrerName = referrerName; // bad 
    } 

"this." 접두사를 사용하면 필드에 인수 값을 할당하도록 컴파일러에 지시 할 수 있습니다. 그것은 매우 일반적인 패턴이며, 인수에 대한 다른 이름을 생각해 내지 않아도됩니다. 또는 필드 이름 앞에 밑줄을 붙이는 것과 같은 어색한 작업을 수행하십시오.

관련 문제