С# имеет статический конструктор, который выполняет некоторую инициализацию. (Вероятно, выполните некоторую неуправляемую инициализацию ресурсов) Мне интересно, есть ли статический деструктор?
Статический деструктор
Ответ 1
Нет, нет.
Статический деструктор, предположительно, будет запускаться в конце выполнения процесса. Когда процесс умирает, вся связанная с ним память/ручки будет освобождена операционной системой.
Если ваша программа должна выполнить определенное действие в конце выполнения (например, механизм транзакционной базы данных, очищая его кеш), это будет гораздо сложнее правильно обрабатывать, чем просто фрагмент кода, который выполняется в конце нормальное выполнение процесса. Вы должны вручную обрабатывать сбои и неожиданное завершение процесса и в любом случае попытаться восстановить его в следующем запуске. Концепция "статического деструктора" не очень поможет.
Ответ 2
Не совсем деструктор, но вот как вы это сделаете:
class StaticClass
{
static StaticClass() {
AppDomain.CurrentDomain.ProcessExit +=
StaticClass_Dtor;
}
static void StaticClass_Dtor(object sender, EventArgs e) {
// clean it up
}
}
Ответ 3
Это лучший способ (ref: fooobar.com/questions/102131/...)
public static class Foo
{
private static readonly Destructor Finalise = new Destructor();
static Foo()
{
// One time only constructor.
}
private sealed class Destructor
{
~Destructor()
{
// One time only destructor.
}
}
}
Ответ 4
Нет, нет. Самое близкое, что вы можете сделать, это установить обработчик событий
к событию DomainUnload
на AppDomain
и выполните его очистку.
Ответ 5
Инициализация и очистка неуправляемых ресурсов от статической реализации довольно проблематична и подвержена проблемам.
Почему бы не использовать singleton и реализовать Finalizer
для экземпляра (идеально наследовать от SafeHandle
)
Ответ 6
Нет ничего подобного деструктору для статических классов, но вы можете использовать событие Appdomain.Unloaded
, если вам действительно нужно что-то сделать