Почему статические классы не могут иметь деструкторы?

две части к этому:

  1. Если статический класс может иметь статический конструктор, почему он не может иметь статический деструктор?

  2. каков наилучший обходной путь? У меня есть статический класс, который управляет пулом соединений, которые являются COM-объектами, и мне нужно убедиться, что их соединения закрываются/освобождаются, если что-то взрывается в другом месте программы.

4 ответов


вместо статического класса вы должны использовать обычный класс с одноэлементным шаблоном (то есть вы сохраняете один экземпляр класса, на который, возможно, ссылается одно статическое свойство самого класса). Тогда вы можете иметь деструктор, или даже лучше, комбинацию деструктора и Dispose метод.

например, если у вас теперь есть:

static class MyClass
{
    public static void MyMethod() {...}
}

//Using the class:
MyClass.MyMethod();

вы бы вместо этого:

class MyClass : IDisposable
{
    public static MyClass()
    {
        Instance=new MyClass();
    }

    public static MyClass Instance {get; private set;}

    public void MyMethod() {...}

    public void Dispose()
    {
        //...
    }

    ~MyClass()
    {
        //Your destructor goes here
    }
}

//Using the class:
MyClass.Instance.MyMethod();

(обратите внимание, как экземпляр создается в статическом конструктор, который вызывается при первом обращении к любому из статических членов класса)


  1. статические классы не имеют деструкторов, потому что статический класс не разрушается.

  2. Если вы хотите создать и уничтожить несколько экземпляров, он не должен быть статическим. Пусть будет полный класс.

  3. деструкторы не должны использоваться для этой цели в любом случае. Используйте IDisposable / Dispose.


1. Почему? -- тип не может иметь конструктора как такового, как вы обычно думаете о конструкторах на экземплярах. В общем, он иногда известен как метод" статического инициализатора", но Microsoft использует терминологию" конструктор типов " (и он имеет специальные ограничения) - вы помещаете в него код для ввода типа/класса - если это был конструктор экземпляра, он может быть перегружен. Это статическое ограничение на "конструктор типов" связано с тем, что .NET CLR отвечает за загрузку класса шаблон в куче и не позволяет указывать параметры при этом обстоятельстве (потому что как бы вы передали аргументы). Поскольку в самом строгом смысле программист не несет ответственности за вызов конструктора типов, было бы не очень разумно позволять программисту кодировать статический деструктор, когда он больше находится в домене CLR. Среда CLR в конечном итоге удалит шаблон класса из кучи, но время жизни шаблона класса больше, чем его экземпляры, поэтому вы все равно не захотите делать в нем ничего ресурсоемкого (например, держать открытым соединение с БД).

2. Что? - Синглтон!--2--> Если вы столкнулись с обстоятельством, когда вам нужно открыть ресурс в шаблоне класса и уничтожить его после этого, вы можете рассмотреть шаблон программного обеспечения Singleton иметь только один экземпляр этого класса и, возможно, также использовать тег


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