Подтвердить что ты не робот

Статический деструктор

С# имеет статический конструктор, который выполняет некоторую инициализацию. (Вероятно, выполните некоторую неуправляемую инициализацию ресурсов) Мне интересно, есть ли статический деструктор?

4b9b3361

Ответ 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, если вам действительно нужно что-то сделать