C #에서 지연 초기화를 수행하는 방법

지연 초기화는 처음 필요할 때까지 객체 생성을 연기하는 기술입니다. 즉, 객체 초기화는 요청시에만 발생합니다. 지연 초기화와 지연 인스턴스화라는 용어는 동일한 의미를 지닙니다. 서로 바꿔서 사용할 수 있습니다. 지연 초기화를 활용하면 불필요한 계산 및 메모리 소비를 방지하여 응용 프로그램의 성능을 향상시킬 수 있습니다. 이 기사에서는 C #에서 지연 초기화를 수행하는 방법을 살펴 보겠습니다.

간단한 예제를 통해 지연 로딩을 이해해 봅시다. 두 개의 클래스 CustomerOrder. Customer클래스는 포함 Orders차례의 인스턴스의 컬렉션을 참조하는 특성 Order클래스를. Orders수집은 많은 양의 데이터를 포함 할 수 있으며, 심지어는 데이터베이스에 연결하여 레코드를 검색하기 위해 데이터베이스 연결을해야 할 수도 있습니다. 이 경우 데이터 Orders가 필요할 때까지 속성에 데이터를로드 할 필요가 없습니다. 지연 초기화를 사용 Orders하면 데이터가 요청 될 때만 컬렉션 을로드 할 수 있습니다 .

C #에서 Lazy 클래스 사용

사용자 지정 코드를 직접 작성하여 지연 초기화를 구현할 수 있지만 Microsoft는 Lazy대신 클래스를 사용하는 것이 좋습니다 . C # LazySystem네임 스페이스에 있는 클래스는 지연 초기화를 구현하는 스레드로부터 안전한 방법을 제공하기 위해 .Net Framework 4.0의 일부로 도입되었습니다. 이 클래스를 활용하여 응용 프로그램에서 리소스를 많이 사용하는 개체의 초기화를 연기 할 수 있습니다.

Lazy클래스 를 사용할 때는 type 인수에서 느리게 만들려는 객체의 유형을 지정해야합니다. Lazy.Value속성에 액세스 할 때 지연 초기화가 발생합니다 . 다음은 Lazy클래스 사용 방법의 예입니다 .

게으른
   
     주문 = 새로운 Lazy
    
     ();
     

IEnumerable 결과 = lazyOrders.Value;

이제 두 개의 클래스 AuthorBlog. 작성자는 많은 블로그 게시물을 작성할 수 있으므로 아래 코드 스 니펫에 표시된대로 AuthorBlog클래스 간에 일대 다 관계가 있습니다.

공개 클래스 작성자

    {

        public int Id {get; 세트; }

        public string FirstName {get; 세트; }

        public string LastName {get; 세트; }

        공개 문자열 주소 {get; 세트; }

        공개 목록 블로그 {get; 세트; }

    }

    공개 수업 블로그

    {

        public int Id {get; 세트; }

        공개 문자열 제목 {get; 세트; }

        public DateTime PublicationDate {get; 세트; }

    }

AuthorBlog클래스 간의 일대 다 관계는 클래스의 List속성 (유형 Blog)을 사용하여 표현되었습니다 Author. 이 속성을 사용하여 Author클래스는 클래스의 하나 이상의 인스턴스 컬렉션을 보유 할 수 있습니다 Blog.

이제 사용자 인터페이스에 작성자의 세부 정보 (이름, 성 및 주소) 만 표시해야한다고 가정합니다. 이 경우 작성자의 블로그 세부 사항을로드 할 필요가 없습니다. 블로그 세부 정보를 느리게로드하려고합니다. 다음은 Author이러한 요구를 해결 하는 업데이트 된 클래스입니다. Lazy클래스 의 사용법에 유의하십시오 .

공개 클래스 작성자

    {

        public int Id {get; 세트; }

        public string FirstName {get; 세트; }

        public string LastName {get; 세트; }

        공개 문자열 주소 {get; 세트; }

        공개 게으른 블로그 => new Lazy (() => GetBlogDetailsForAuthor (this.Id));

        개인 IList GetBlogDetailsForAuthor (int Id)

        {

       // 여기에 코드를 작성하여 작성자의 모든 블로그 세부 정보를 검색합니다.

        }

    }

C #에서 제네릭 Lazy 클래스 사용

이제 일반 Lazy클래스를 활용하여 Singleton 디자인 패턴을 구현하는 방법을 살펴 보겠습니다 . (여기에서 Singleton 디자인 패턴에 대한 기사를 읽을 수 있습니다.) 다음 버전의 StateManager클래스는 스레드로부터 안전합니다. 동시에 지연 초기화를 보여줍니다. 명시 적 정적 생성자는 C # 컴파일러가 형식을 beforefieldinit.

공개 봉인 클래스 StateManager

    {

        개인 StateManager ()

        {

        }

        공용 정적 StateManager 인스턴스

        {

            가져 오기

            {

                반환 Nested.obj;

            }

        }

        개인 클래스 중첩

        {

            정적 Nested ()

            {

            }

            내부 정적 읽기 전용 StateManager obj = new StateManager ();

        }

    }

다음은 StateManager클래스를 활용하는 Lazy클래스 의 지연 구현입니다 . Lazy클래스가 게으름을 구현하는 것을 정말 간단하게 만드는 방법을 알 수 있습니다 . 

공용 클래스 StateManager

    {

        개인 정적 읽기 전용 Lazy obj = new Lazy (() => new StateManager ());

        private StateManager () {}

        공용 정적 StateManager 인스턴스

        {

            가져 오기

            {

                return obj.Value;

            }

        }

    }

위 클래스 의 Instance속성을 살펴보십시오 StateManager. Value위 코드 예제에서 볼 수있는 속성은 읽기 전용입니다. 이러한 이유로 설정된 접근자가 없습니다.

지연 초기화는 뛰어난 성능 최적화 기술로, 상당한 CPU 및 메모리 리소스를 사용하는 개체의 초기화를 절대적으로 필요할 때까지 연기 할 수 있습니다. 지연 초기화를 활용하여 앱 성능을 개선하십시오.