Полное руководство по языку программирования С# 14 и платформе .NET 10 / Дополнительные классы и структуры .NET

Отложенная инициализация и тип Lazy

Начальный ⏱ 2 мин чтения 👁 2 🕓 обновлено 11.08.2026

Приложение может использовать множество классов и объектов. Однако есть вероятность, что не все создаваемые объекты будут использованы. Особенно это касается больших приложений. Например:


class Reader
{
    Library library = new Library();
    public void ReadBook()
    {
        library.GetBook();
        Console.WriteLine("Читаем бумажную книгу");
    }

    public void ReadEbook()
    {
        Console.WriteLine("Читаем книгу на компьютере");
    }
}

class Library
{
    private string[] books = new string[99];

    public void GetBook()
    {
        Console.WriteLine("Выдаем книгу читателю");
    }
}

Есть класс Library, представляющий библиотеку и хранящий некоторый набор книг в виде массива. Есть класс читателя Reader, который хранит ссылку на объект библиотеки, в которой он записан. У читателя определено два метода: для чтения электронной книги и для чтения обычной книги. Для чтения обычной книги необходимо обратиться к методу класса Library, чтобы получить эту книгу.

Но что если читателю вообще не придется читать обычную книгу, а только электронные, например, в следующем случае:


Reader reader = new Reader();
reader.ReadEbook();

В этом случае объект library в классе читателя никак не будет использоваться и будет только занимать место памяти. Хотя надобности в нем не будет.

Для подобных случаев в .NET определен специальный класс Lazy<T>. Изменим класс читателя следующим образом:


class Reader
{
    Lazy<Library> library = new Lazy<Library>();
    public void ReadBook()
    {
        library.Value.GetBook();
        Console.WriteLine("Читаем бумажную книгу");
    }

    public void ReadEbook()
    {
        Console.WriteLine("Читаем книгу на компьютере");
    }
}

Класс Library остается прежнем. Но теперь класс читателя содержит ссылку на библиотеку в виде объекта Lazy<Library>. А чтобы обратиться к самой библиотеке и ее методам, надо использовать выражение library.Value - это и есть объект Library.

Что меняет в поведении класса Reader эта замена? Рассмотрим его применение:


Reader reader = new Reader();
reader.ReadEbook();
reader.ReadBook();

Непосредственно объект Library задействуется здесь только на третьей строке в методе reader.ReadBook(), который вызывает в свою очередь метод library.Value.GetBook(). Поэтому вплоть до третьей строки объект Library, используемый читателем, не будет создан. Если мы не будем применять в программе метод reader.ReadBook(), то объект библиотеки тогда вообще не будет создан, и мы избежим лишних затрат памяти. Таким образом, Lazy&ltT> гарантирует нам, что объект будет создан только тогда, когда в нем есть необходимость.

Проверь себя

📋 Тест по теме «Отложенная инициализация и тип Lazy» Тест по теме

Практические задания

Лёгкое Ручная проверка Заполните пропуск в коде (1)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

class _____
{
    Library library = new Library();
    public void ReadBook()
    {
        library.GetBook();
        Console.WriteLine("Читаем бумажную книгу");
    }

    public void ReadEbook()
    {
        Console.WriteLine("Читаем книгу на компьютере");
    }
}

class Library
{
    private string[] books = new string[99];

    public void GetBook()
    {
        Console.WriteLine("Выдаем книгу читателю");
    }
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (2)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

Reader _____ = new Reader();
reader.ReadEbook();
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (3)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

class Reader
{
    Lazy<_____> library = new Lazy<Library>();
    public void ReadBook()
    {
        library.Value.GetBook();
        Console.WriteLine("Читаем бумажную книгу");
    }

    public void ReadEbook()
    {
        Console.WriteLine("Читаем книгу на компьютере");
    }
}
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (4)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

_____ reader = new Reader();
reader.ReadEbook();
reader.ReadBook();
Войдите, чтобы отправить решение
Лёгкое Ручная проверка Заполните пропуск в коде (5)
+10 XP

В приведённом ниже фрагменте кода из этого урока пропущено одно слово. Определите его и впишите в поле ответа (без кавычек и пробелов).

class Reader
{
    Library library = new Library();
    public void ReadBook()
    {
        library._____();
        Console.WriteLine("Читаем бумажную книгу");
    }

    public void ReadEbook()
    {
        Console.WriteLine("Читаем книгу на компьютере");
    }
}

class Library
{
    private string[] books = new string[99];

    public void GetBook()
    {
        Console.WriteLine("Выдаем книгу читателю");
    }
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (1)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

class Reader
{
    Library library = new Library();
    public void ReadBook()
    {
        library._____();
        Console.WriteLine("Читаем бумажную книгу");
    }

    public void _____()
    {
        Console.WriteLine("Читаем книгу на компьютере");
    }
}

class Library
{
    private string[] books = new string[99];

    public void GetBook()
    {
        Console.WriteLine("Выдаем книгу читателю");
    }
}
Войдите, чтобы отправить решение
Среднее Ручная проверка Восстановите код по памяти (2)
+20 XP

В этом фрагменте кода урока пропущены два ключевых элемента. Впишите оба пропущенных значения через запятую в порядке появления (например: x, 5).

_____ _____ = new Reader();
reader.ReadEbook();
Войдите, чтобы отправить решение
Среднее Ручная проверка Расставьте строки кода в правильном порядке
+20 XP

Строки кода из примера этого урока перемешаны. Впишите их в правильном порядке, каждую строку — с новой строки.

reader.ReadEbook();
reader.ReadBook();
Reader reader = new Reader();
Войдите, чтобы отправить решение
Сложное Ручная проверка Объясните и модифицируйте пример из урока «Отложенная инициализация и тип Lazy»
+30 XP

Опишите своими словами, что делает приведённый пример кода из урока «Отложенная инициализация и тип Lazy», и предложите одно осмысленное изменение (например, другое входное значение или дополнительное условие). Приведите итоговый код.

class Reader
{
    Library library = new Library();
    public void ReadBook()
    {
        library.GetBook();
        Console.WriteLine("Читаем бумажную книгу");
    }

    public void ReadEbook()
    {
        Console.WriteLine("Читаем книгу на компьютере");
    }
}

class Library
{
    private string[] books = new string[99];

    public void GetBook()
    {
        Console.WriteLine("Выдаем книгу читателю");
    }
}
Войдите, чтобы отправить решение
Сложное Ручная проверка Найдите потенциальную проблему в коде урока «Отложенная инициализация и тип Lazy»
+30 XP

Изучите приведённый фрагмент кода и опишите, при каких входных данных или условиях он может сработать не так, как ожидается (граничный случай, отсутствие проверки и т.п.). Предложите исправленный вариант.

Reader reader = new Reader();
reader.ReadEbook();
Войдите, чтобы отправить решение
Мини-проект Ручная проверка Мини-проект по теме «Отложенная инициализация и тип Lazy»
+50 XP

Соберите небольшую программу, которая последовательно демонстрирует ключевые идеи урока. Программа должна быть рабочей и содержать минимум два самостоятельно написанных фрагмента, а не просто копию примера из урока.

Войдите, чтобы отправить решение
Домашнее задание Ручная проверка Домашнее задание по теме «Отложенная инициализация и тип Lazy»
+25 XP

Напишите собственную небольшую программу, применяющую материал темы «Отложенная инициализация и тип Lazy». Используйте не менее одной конструкции, показанной в примерах урока. Прикрепите код решения и краткое описание того, что он делает.

Войдите, чтобы отправить решение

Обсуждение (0)

Войдите, чтобы оставить комментарий.