Section 39.9: 생성자와 속성값 초기화 순서

속성값의 할당이 클래스의 생성자보다 먼저 이루어지는지, 아니면 나중에 이루어지는지를 알아보도록 한다.

public class TestClass { public int TestProperty { get; set; } = 2; public TestClass() { if (TestProperty == 1) { Console.WriteLine("Shall this be executed?"); } if (TestProperty == 2) { Console.WriteLine("Or shall this be executed"); } } } var testInstance = new TestClass() { TestProperty = 1 };

위 예제에서, TestProperty 값이 클래스의 생성자 안에서 이미 1 로 할당이 되어 있을지, 아니면 생성자 호출이 완료된 이후 할당이 되어있을지를 확인해 본다.

다음과 같이 인스턴스 생성시에 속성값을 할당하는 경우:

var testInstance = new TestClass() {TestProperty = 1};

실제 값 할당은 생성자가 실행 완료된 이후에 이루어진다. 그러나, 아래와 같은 C# 6.0 에서의 클래스 내 속성 값 초기화를 수행하는 경우:

public class TestClass { public int TestProperty { get; set; } = 2; public TestClass() {} }

실제 값 할당은 생성자가 실행 되기 전에 이루어진다.

위 두가지의 개념을 하나의 예제로 합쳐서 생각해보면:

public class TestClass { public int TestProperty { get; set; } = 2; public TestClass() { if (TestProperty == 1) { Console.WriteLine("Shall this be executed?"); } if (TestProperty == 2) { Console.WriteLine("Or shall this be executed"); } } } static void Main(string[] args) { var testInstance = new TestClass() { TestProperty = 1 }; Console.WriteLine(testInstance.TestProperty); // 최종 결과는 1 이 된다 }

최종 출력 결과:

"Or shall this be executed" "1"

설명:

TestProperty 는 최초에 값 2 를 할당받게 되며, 이후 TestClass 의 생성자가 실행되고, 이로 인해 "Or shall this be executed" 출력이 이루어진다.

그런 다음 new TestClass() { TestProperty = 1 } 로 인해 TestProperty 의 값은 1 로 할당되며, 이후 Console.WriteLine(testInstance.TestProperty) 에 의해 출력되는 TestProperty 의 최종 값은 "1" 이 된다

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts