Section 7.5: Null 병합 연산자를 이용한 property 초기화 지연 (lazy initialization)

private List < FooBar > _fooBars; public List < FooBar > FooBars { get { return _fooBars ?? (_fooBars = new List < FooBar > ()); } }

.FooBars property 가 최초로 액세스되는 시점에는 _fooBars 변수가 null 인 상태일 것이므로, 할당 구문이 곧바로 실행될 것이며 액세스의 최종 결과는 해당 할당 구문의 결과값으로 평가 (evaluate) 될 것이다.

Thread safety

위 예제에서 소개된 지연된 (lazy) property 는 thread safe 한 방법으로 구현되어 있지 않다. thread safe 한 구현을 위해서는, .NET Framework 의 일부분으로 포함되어 있는 Lazy<T> 클래스를 이용하도록 한다.

표현식 본문을 이용한 C# 6 의 Syntactic Sugar

C# 6 이후부터는, 위 문법이 property 에 대한 표현식 본문 (expression body) 을 사용하여 보다 단순화될 수 있다:

private List<FooBar> _fooBars; public List<FooBar> FooBars => _fooBars ?? ( _fooBars = new List<FooBar>() );

최초 할당 이후의 property 에 대한 액세스는 _fooBars 변수에 저장된 값을 사용하게 될 것이다.

MVVM 패턴에서의 사용 예제

이러한 방법은 MVVM 패턴에서 command 를 구현할 때 주로 사용될 것이다. 각 command 들을 view model 생성시에 즉시 (eagerly) 초기화하는 대신, command 들은 다음과 같이 위에서 소개된 패턴을 이용하여 지연되어 (lazily) 초기화 될 것이다:

private ICommand _actionCommand = null; public ICommand ActionCommand => _actionCommand ?? ( _actionCommand = new DelegateCommand( DoAction ) );
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

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

반응형

+ Recent posts