Читайте также: |
|
{
protected virtual void Finalize () {}
}
За счет его переопределения в специальных классах устанавливается специфическое место для выполнения любой необходимой данному типу логики по очистке. Из-за того, что метод Finalize() по определению является защищенным (protected), вызывать его напрямую из класса экземпляра с помощью операции точки не допускается.
Вместо этого метод Finalize() (если он поддерживается) будет автоматически вызываться сборщиком мусора перед удалением соответствующего объекта из памяти.
В подавляющем большинстве классов С# необходимость в создании явной логики по очистке или специального финализатора возникать не будет. Объясняется это очень просто: если в классах используются лишь другие управляемые объекты, все они рано или поздно все равно будут подвергаться сборке мусора. Единственным случаем, когда может возникать потребность в создании класса, способного выполнять после себя процедуру очистки, является работа с неуправляемыми ресурсами (такими как низкоуровневые файловые дескрипторы, низкоуровневые неуправляемые соединения с базами данных, фрагменты неуправляемой памяти и т.п.). Внутри .NET неуправляемые ресурсы появляются в результате непосредственного вызова API -интерфейса операционной системы с помощью служб PInvoke (Platform Invocation Services — службы вызова платформы) или применения очень сложных сценариев взаимодействия с СОМ. Ознакомьтесь со следующим правилом сборки мусора.
Правило. Единственная причина переопределения Finalize() связана с использованием в классе С# каких-то неуправляемых ресурсов через PInvoke или сложных процедур взаимодействия с СОМ.
Если вы хотите, чтобы ваш пользовательский класс поддерживал метод Finalize(), вы должны использовать в определении этого класса метод, очень похожий на деструктор С++:
// Переопределение System.Object.Finalize()
//с использованием синтаксиса финализатора.
public class MyResourceWrapper: Object
{
~ MyResourceWrapper ()
{
// Здесь производится очистка неуправляемых ресурсов.
// Далее в C# автоматически будет вызван метод Base.Finalize()
}
}
При обработке синтаксиса финализатора компилятор автоматически добавляет в неявно переопределяемый метод Finalize() приличное количество требуемых элементов инфраструктуры.
Финализаторы в С# очень похожи на конструкторы тем, что именуются идентично классу, внутри которого определены. Помимо этого, они сопровождаются префиксом в виде тильды (~). В отличие от конструкторов, однако, они никогда не снабжаются модификатором доступа (поскольку всегда являются неявно защищенными), не принимают никаких параметров и не могут быть перегружены (в каждом классе может присутствовать только один финализатор).
Дата добавления: 2015-07-25; просмотров: 43 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Фоновая сборка мусора в версии .NET 4.0 | | | Описание процесса финализации |