Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
// При использовании переменной Lazy() вызывается
// стандартный конструктор класса AllTracks.
private Lazy<AllTracks> _allSongs = new Lazy<AllTracks>();
В некоторых случаях приведенный код может оказаться приемлемым, но что если класс
AllTracks
Lazy()
AllTracks
Lazy()
Таким обобщенным делегатом является тип
System.Func<>
Lazy<>
Func<>
Func<>
Ниже показана окончательная версия класса
MediaPlayer
AllTracks
Lazy<>
AllTracks
class MediaPlayer
{
...
// Использовать лямбда-выражение для добавления дополнительного
// кода, который выполняется при создании объекта AllTracks.
private Lazy<AllTracks> _allSongs =
new Lazy<AllTracks>( () =>
{
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
В настоящей главе представлен обзор разнообразных пространств имен и типов коллекций (обобщенных и необобщенных), находящихся в библиотеках базовых классов .NET Core. Вы увидите, что обобщенные контейнеры часто превосходят свои необобщенные аналоги, поскольку они обычно обеспечивают лучшую безопасность в отношении типов и дают выигрыш в плане производительности. После того, как вы научитесь создавать и манипулировать обобщенными элементами внутри платформы, в оставшемся материале главы будет продемонстрировано создание собственных обобщенных методов и типов. Вы узнаете о роли ограничений (и соответствующего ключевого слова
where