Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
.method family hidebysig virtual instance void Finalize() cil managed { .override [System.Runtime]System.Object::Finalize // Code size 17 (0x11) .maxstack 1 .try { IL_0000: call void [System.Console]System.Console::Beep() IL_0005: nop IL_0006: leave.s IL_0010 } // end .try finally { IL_0008: ldarg.0 IL_0009: call instance void [System.Runtime]System.Object::Finalize() IL_000e: nop IL_000f: endfinally } // end handler IL_0010: ret} // end of method MyResourceWrapper::FinalizeТестирование класса
MyResourceWrapperusing System;using SimpleFinalize;Console.WriteLine("***** Fun with Finalizers *****n");Console.WriteLine("Hit return to create the objects ");Console.WriteLine("then force the GC to invoke Finalize()"); // Нажмите клавишу <Enter>, чтобы создать объекты // и затем заставить сборщик мусора вызвать метод Finalize()// В зависимости от мощности вашей системы// вам может понадобиться увеличить эти значения.CreateObjects(1_000_000);// Искусственно увеличить уровень давления.GC.AddMemoryPressure(2147483647);GC.Collect(0, GCCollectionMode.Forced);GC.WaitForPendingFinalizers();Console.ReadLine();static void CreateObjects(int count){ MyResourceWrapper[] tonsOfObjects = new MyResourceWrapper[count]; for (int i = 0; i < count; i++) { tonsOfObjects[i] = new MyResourceWrapper(); } tonsOfObjects = null;}На заметку! Единственный способ гарантировать, что такое небольшое консольное приложение принудительно запустит сборку мусора в .NET Core, предусматривает создание огромного количества объектов в памяти и затем установит ссылку на них в null. После запуска этого приложения не забудьте нажать комбинацию клавиш <Ctrl+C>, чтобы остановить его выполнение и прекратить выдачу звуковых сигналов!
Подробности процесса финализации
Важно всегда помнить о том, что роль метода
Finalize()Finalize()При размещении объекта в управляемой куче исполняющая среда автоматически определяет, поддерживает ли он специальный метод
Finalize()Когда сборщик мусора решает, что наступило время высвободить объект из памяти, он просматривает каждую запись в очереди финализации и копирует объект из кучи в еще одну управляемую структуру под названием таблица объектов, доступных для финализации. На этой стадии порождается отдельный поток для вызова метода
Finalize()Подводя итоги, следует отметить, что хотя финализация объекта гарантирует ему возможность освобождения неуправляемых ресурсов, она все равно остается недетерминированной по своей природе, а из-за незаметной дополнительной обработки протекает значительно медленнее.
Построение освобождаемых объектов
Как вы уже видели, финализаторы могут использоваться для освобождения неуправляемых ресурсов при запуске сборщика мусора. Тем не менее, учитывая тот факт, что многие неуправляемые объекты являются "ценными элементами" (вроде низкоуровневых дескрипторов для файлов или подключений к базам данных), зачастую полезно их освобождать как можно раньше, не дожидаясь наступления сборки мусора. В качестве альтернативы переопределению метода
Finalize()IDisposableDispose()public interface IDisposable{ void Dispose();}При реализации интерфейса
IDisposableDispose()Похожие книги на "Язык программирования C#9 и платформа .NET5", Троелсен Эндрю
Троелсен Эндрю читать все книги автора по порядку
Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки mir-knigi.info.