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/
반응형
'번역 > C# Notes for Professionals' 카테고리의 다른 글
8.2: Null 조건부 인덱스 (index) (0) | 2020.12.10 |
---|---|
8.1: Null 조건부 연산자 (0) | 2020.12.08 |
7.4: 기존 객체를 사용하거나 없는 경우 새로 생성하기 (0) | 2020.12.04 |
7.3: Null 병합 연산자를 메소드 호출 결과에 사용하기 (0) | 2020.12.04 |
7.2: Null fall-through 와 chaining (0) | 2020.12.02 |