Чтобы протестировать финальную версию класса MyResourceWrapper
Program.cs, как показано ниже:using System;
using FinalizableDisposableClass;
Console.WriteLine("***** Dispose / Destructor Combo Platter *****");
// Вызвать метод Dispose вручную, что не приводит к вызову финализатора.
MyResourceWrapper rw = new MyResourceWrapper;
rw.Dispose;
// He вызывать метод Dispose. Это запустит финализатор,
// когда объект будет обрабатываться сборщиком мусора.
MyResourceWrapper rw2 = new MyResourceWrapper;
В коде явно вызывается метод Dispose
Dispose на объекте rw2; переживать не стоит — финализатор все равно выполнится при обработке объекта сборщиком мусора.На этом исследование особенностей управления объектами со стороны исполняющей среды через сборку мусора завершено. Хотя дополнительные (довольно экзотические) детали, касающиеся процесса сборки мусора (такие как слабые ссылки и восстановление объектов), здесь не рассматривались, полученных сведений должно быть вполне достаточно, чтобы продолжить изучение самостоятельно. В завершение главы мы взглянем на программное средство под названием
Ленивое создание объектов
При создании классов иногда приходится учитывать, что отдельная переменная-член на самом деле может никогда не понадобиться из-за того, что пользователь объекта не будет обращаться к методу (или свойству), в котором она используется. Действительно, подобное происходит нередко. Однако проблема может возникнуть, если создание такой переменной-члена сопряжено с выделением большого объема памяти.
В качестве примера предположим, что строится класс, который инкапсулирует операции цифрового музыкального проигрывателя. В дополнение к ожидаемым методам вроде Play
Pause и Stop вы также хотите обеспечить возможность возвращения коллекции объектов Song (посредством класса по имени AllTracks), которая представляет все имеющиеся на устройстве цифровые музыкальные файлы.Создайте новый проект консольного приложения по имени LazyObjectInstantiation
// Song.cs
namespace LazyObjectInstantiation
{
// Представляет одиночную композицию.
class Song
{
public string Artist { get; set; }
public string TrackName { get; set; }
public double TrackLength { get; set; }
}
}
// AllTracks.cs
using System;
namespace LazyObjectInstantiation
{
// Представляет все композиции в проигрывателе.
class AllTracks
{
// Наш проигрыватель может содержать
// максимум 10 000 композиций.
private Song[] _allSongs = new Song[10000];
public AllTracks
{
// Предположим, что здесь производится
// заполнение массива объектов Song.
Console.WriteLine("Filling up the songs!");
}
}
}
// MediaPlayer.cs
using System;
namespace LazyObjectInstantiation
{
// Объект MediaPlayer имеет объекты AllTracks.
class MediaPlayer
{
// Предположим, что эти методы делают что-то полезное.
public void Play { /* Воспроизведение композиции */ }
public void Pause { /* Пауза в воспроизведении */ }
public void Stop { /* Останов воспроизведения */ }
private AllTracks _allSongs = new AllTracks;
public AllTracks GetAllTracks
{
// Возвратить все композиции.
return _allSongs;
}
}
}
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT