정식 문서 :
https://learn.microsoft.com/ko-kr/dotnet/framework/performance/lazy-initialization
사용할 때 까지 초기화하지 않는 class.Thread-safe하다.// 정의
public class Lazy<T>
Lazy<T>()
//Lazy<T> 클래스의 새 인스턴스를 초기화합니다. 지연 초기화가 발생하면 대상 형식의 매개 변수가 없는 생성자가 사용됩니다.
Lazy<T>(Boolean)
//Lazy<T> 클래스의 새 인스턴스를 초기화합니다. 지연 초기화가 발생하면 대상 형식의 매개 변수가 없는 생성자와 지정된 초기화 모드가 사용됩니다.
// false일때 thread-safe가 사라진다. -> 값이 덮어 씌워질 수 있다.
Lazy<T>(Func<T>)
//Lazy<T> 클래스의 새 인스턴스를 초기화합니다. 지연 초기화가 발생하면 지정된 초기화 함수가 사용됩니다.
Lazy<T>(Func<T>, Boolean)
//Lazy<T> 클래스의 새 인스턴스를 초기화합니다. 지연 초기화가 발생하면 지정된 초기화 함수 및 초기화 모드가 사용됩니다.
Lazy<T>(Func<T>, LazyThreadSafetyMode)
//지정된 초기화 함수 및 스레드 안전 모드를 사용하는 Lazy<T> 클래스의 새 인스턴스를 초기화합니다.
Lazy<T>(LazyThreadSafetyMode)
//T 매개 변수가 없는 생성자 및 지정된 스레드 안전 모드를 사용하는 Lazy<T> 클래스의 새 인스턴스를 초기화합니다.
Lazy<T>(T)
//미리 초기화된 지정된 값을 사용하는 Lazy<T> 클래스의 새 인스턴스를 초기화합니다.
// 실 사용
var Something = Lazy<T>();
var Something = Lazy<T>(()=>new T()); // 함수를 실행하며 초기화
...
IsValueCreated
//이 Lazy<T> 인스턴스에 대해 값이 만들어졌는지 여부를 나타내는 값을 가져옵니다.
Value
//현재 Lazy<T> 인스턴스의 지연 초기화 값을 가져옵니다.
.Value를 붙혀야 한다.false / None를 준다면, 다른 스레드에서 여러번 실행될 수도 있으니 주의해야 한다.LazyThreadSafetyMode 를 통해 설정하는 경우, PublicationOnly를 쓰게 되면 객체는 단 하나 생성되지만 초기화는 여러번 시도될 수 있음.Singleton 패턴에서 유용하게 활용될 수 있다. private static readonly Lazy<ScheduleDatabase> _instance = new (() => new ScheduleDatabase()); // 바로 초기화
public static ScheduleDatabase Instance { get=> _instance.Value };