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



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

531   6  

6 ответов:

нет, нет.

статический деструктор предположительно будет работать в конце выполнения процесса. Когда процесс умирает, вся память/дескрипторы, связанные с ним, будут освобождены операционной системой.

Если ваша программа должна выполнить определенное действие в конце выполнения (например, транзакционный компонент database engine, очищающий свой кэш), это будет намного сложнее правильно обрабатывать, чем просто кусок кода, который выполняется в конце обычного выполнения процесс. Вы должны вручную обрабатывать сбои и неожиданное завершение процесса и попытаться восстановить при следующем запуске в любом случае. Концепция "статического деструктора" не очень поможет.

не совсем деструктор, но вот как бы вы это сделали:

class StaticClass 
{
   static StaticClass() {
       AppDomain.CurrentDomain.ProcessExit +=
           StaticClass_Dtor;
   }

   static void StaticClass_Dtor(object sender, EventArgs e) {
        // clean it up
   }
}

Это лучший способ (ref:https://stackoverflow.com/a/256278/372666)

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.
        }
    }
}

нет, нет. Самая близкая вещь вы можете сделать, это установить обработчик событий к DomainUnload событие AppDomain и выполнить очистку там.

Инициализация и очистка неуправляемых ресурсов от статической реализации довольно проблематична и подвержена проблемам.

почему бы не использовать Синглтон, и реализовать Finalizer для экземпляра (идеально наследовать от SafeHandle)

нет нет ничего похожего на деструктор для статических классов, но вы можете использовать Appdomain.Unloaded событие, если вам действительно нужно что-то делать

Comments

    Ничего не найдено.