Таким обобщенным делегатом является тип System.Func<>
Lazy<>, и способный принимать вплоть до 16 аргументов (типизированных с применением обобщенных параметров типа). В большинстве случаев никаких параметров для передачи методу, на который указывает Func<>, задавать не придется. Вдобавок, чтобы значительно упростить работу с типом Func<>, рекомендуется использовать лямбда-выражения (отношения между делегатами и лямбда-выражениями подробно освещаются в главе 12).Ниже показана окончательная версия класса MediaPlayer
AllTracks. Не забывайте, что перед завершением метод должен возвратить новый экземпляр типа, помещенного в Lazy<>, причем применять можно любой конструктор по своему выбору (здесь по-прежнему вызывается стандартный конструктор AllTracks).class MediaPlayer
{
...
// Использовать лямбда-выражение для добавления дополнительного
// кода, который выполняется при создании объекта AllTracks.
private Lazy
new Lazy
{
Console.WriteLine("Creating AllTracks object!");
return new AllTracks;
}
);
public AllTracks GetAllTracks
{
// Возвратить все композиции.
return _allSongs.Value;
}
}
Итак, вы наверняка смогли оценить полезность класса Lazy<>
Резюме
Целью настоящей главы было прояснение процесса сборки мусора. Вы видели, что сборщик мусора запускается, только если не удается получить необходимый объем памяти из управляемой кучи (либо когда разработчик вызывает GC.Collect
В главе также было показано, каким образом программно взаимодействовать со сборщиком мусора с применением класса System.GC
Вспомните, что финализируемые типы — это классы, которые предоставляют деструктор (переопределяя метод Finalize
ref), реализующими интерфейс IDisposable, к которому пользователь объекта должен обращаться по завершении работы с ними. Наконец, вы изучили официальный шаблон освобождения, в котором смешаны оба подхода.В заключение был рассмотрен обобщенный класс по имени Lazy<>
Lazy<> помогает сократить количество объектов, хранящихся в управляемой куче, и также обеспечивает создание затратных объектов только тогда, когда они действительно нужны в вызывающем коде.Часть IV
Дополнительные конструкции программирования на C#
Глава 10
Коллекции и обобщения
Любому приложению, создаваемому с помощью платформы .NET Core, потребуется решать вопросы поддержки и манипулирования набором значений данных в памяти. Значения данных могут поступать из множества местоположений, включая реляционную базу данных, локальный текстовый файл, XML-документ, вызов веб-службы, или через предоставляемый пользователем источник ввода.
В первом выпуске платформы .NET программисты часто применяли классы из пространства имен System.Collections
System.Collections.Generic.Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT