2015-01-17 2 views
1

초기화 목록과 생성자 함수의 호출 순서는 무엇입니까? 내가 new MyClass() { MyIntegerValue = 5 }DoA() 또는 DoB()이 실행됩니다 호출하는 경우 초기화 목록 및 생성자 함수 호출 순서

public class MyClass { 

    public int MyIntegerValue { set; get; } 

    public MyClass() { 
     if(MyIntegerValue = 5) { 
      DoA(); 
     } else { 
      DoB(); 
     } 
    } 
} 

는 이전 코드를 감안할 때?

DoB()이 실행될 경우 MyIntegerValue을 생성자 함수에 전달하지 않고 DoA()을 호출 할 수있는 방법이 있습니까?

+0

'MyIntegerValue'는 (는)'MyClass'의 속성입니까? 그렇다면 코드 스 니펫에이를 추가 할 수 있습니까? – adv12

+1

또한 직접 작성한 질문보다 빠른 명령 줄 앱을 사용하여 직접 테스트 할 수 있습니다. – adv12

+0

@ adv12 그럼에도 불구하고 이것은 사람들이 배울 수있는 흥미로운 질문입니다. 나는 downvote에 사람들의 충동을 얻지 않는다. 질문이 마음에 들지 않으면 대답하지 마십시오. –

답변

2

하고 MyIntegerValue이 할당됩니다 : 그것은

if (MyIntegerValue === 5) // not '=' (assignment) but '==' (equality check) 

이 아마도 당신이 뭔가를 할 수 있어야합니다. 당신이

private int _MyIntegerValue = 5; 

public int MyIntegerValue 
{ 
    get { return _MyIntegerValue; } 
    set { _MyIntegerValue = value; } 
} 

또는

public MyClass(int _myIntegerValue) 
{ 
    MyIntegerValue = _myIntegerValue; 
    if (MyIntegerValue == 5) 
     DoA(); 
    else 
     DoB(); 
} 

을하고이

처럼 호출 할 수 있습니다 그러나

코드는 단순히

MyClass mc = new MyClass(); 
mc.MyIntegerValue = 5; 

입니다

3
var x = new MyClass() { MyIntegerValue = 5 }; 

는하지만 문법적 거기에 아무것도

var x = new MyClass(); 
x.MyIntegerValue = 5; 

의 약어입니다.

그래서 대답은 생성자가 먼저 호출된다는 것입니다.

0

생성자가 1을 실행하므로 클래스가 초기화 될 때 MyIntegerValues이 0이됩니다.

또한 오타가 있습니다. 첫 번째 생성자가 호출되기 때문에, 그것은 DoB를 실행합니다이 경우

public class MyClass { 

public int MyIntegerValue { get; private set; } 

public MyClass(int v) { 
    MyIntegerValue = v; 
    if(MyIntegerValue == 5) { 
     DoA(); 
    } else { 
     DoB(); 
    } 
} 
} 
0

짧은 손으로 클래스를 초기화하지만 장면 뒤에서는 여전히 생성자를 실행 한 다음 속성을 초기화합니다.

따라서 생성자가 실행될 때 속성이 5로 설정되지 않으므로 DoB가 호출됩니다.

DoA를 호출하려면 속성을 값 5 기본값으로 설정해야합니다. 이런 식으로해야합니다.

public class MyClass 
    { 

     private int _MyIntegerValue = 5; 
     public int MyIntegerValue 
     { 
      get 
      { 
       return _MyIntegerValue; 
      } 
      set 
      { 
       _MyIntegerValue = value; 
      } 
     } 

     public MyClass() 
     { 
      if (MyIntegerValue == 5) 
      { 
       DoA(); 
      } 
      else 
      { 
       DoB(); 
      } 
     } 
}